<!doctype html>
<html lang="ru" data-bs-theme="dark">

<head>
    <!-- 2024-05-11 14:14:19 -->
        <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>git bisect-lk2009</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" integrity="sha512-jnSuA4Ss2PkkikSOLtYs8BlYIeeIK1h99ty4YfvRPAlzr377vr3CXDb7sb7eEEBYjDtcYj+AjBH3FLv5uSJuXg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.11.3/font/bootstrap-icons.min.css" integrity="sha512-dPXYcDub/aeb08c63jRq/k6GaKccl256JQy/AnOq7CAnEZ9FzSL9wSbcZkMp4R26vBsMLFYH4kQ67/bbV8XaCQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css" integrity="sha512-rO+olRTkcf304DQBxSWxln8JXCzTHlKnIdnMUwYvQa9/Jd4cQaNkItIUj6Z4nvW1dqK0SKXLbn9h4KwZTNtAyw==" crossorigin="anonymous" referrerpolicy="no-referrer" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/7.1.0/css/flag-icons.min.css" integrity="sha512-bZBu2H0+FGFz/stDN/L0k8J0G8qVsAL0ht1qg5kTwtAheiXwiRKyCq1frwfbSFSJN3jooR5kauE0YjtPzhZtJQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
    <link href="../../../runebook.css" rel="stylesheet" type="text/css">
    <meta name="x-github" content="https://github.com/runebookdev/runebook">
            <meta name="x-i18n-doc" content="git">
        <script>
        function i18n(element) {
            // NOP
        }
    </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/3.0.5/js.cookie.js" integrity="sha512-F/dia2jKME12jwqiYDayeD+Rr/8jTWUD2wfbuJB0bzSwenSEnXsn4qQ/wVyXUCix5bmCAj8xJdtFr2OqUtjLAw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.bundle.min.js" integrity="sha512-7Pi/otdlbbCR+LnW+F7PwFcSDJOuUJB3OxtEHbg4vSMvzvJjde4Po1v4BR9Gdc9aXNUNFVUY+SK51wWT8WF0Gg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/7.8.1/rxjs.umd.min.js" integrity="sha512-D9LDs8YUUVa4V9Gl4Zb+xqRAc7RCzooR3+zzebgK2RMu/KU+dh90pbjEEMzPiSyRSGbSp9j1pZnrO4joGa5WEg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.min.js" integrity="sha512-mhbv5DqBMgrWL+32MmsDOt/OAvqr/cHimk6B8y/bx/xS88MVkYGPiVv2ixKVrkywF2qHplNRUvFsAHUdxZ3Krg==" crossorigin="anonymous"></script>
    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6424571640879890" crossorigin="anonymous"></script>    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3G5BZ1QEDP"></script>
<script>
    window.dataLayer = window.dataLayer || [];

    function gtag() {
        dataLayer.push(arguments);
    }

    gtag('js', new Date());
    gtag('config', 'G-3G5BZ1QEDP');
</script>    <script>
(function(c, l, a, r, i, t, y) {
    c[a] = c[a] || function() {
        (c[a].q = c[a].q || []).push(arguments)
    };
    t = l.createElement(r);
    t.async = 1;
    t.src = "https://www.clarity.ms/tag/" + i + "?ref=bwt";
    y = l.getElementsByTagName(r)[0];
    y.parentNode.insertBefore(t, y);
})(window, document, "clarity", "script", "jto2hd94r9");
</script>    <script src="../../../theme.js"></script>
</head>

<body>
    <header class="bg-black">
        <div class="container">
            <div class="row">
                <div class="col">
                    <nav class="navbar navbar-expand-lg navbar-dark">
                        <a class="navbar-brand fw-bold" href="https://runebook.dev/ru">
                            <img alt="Runebook.dev" class="d-inline-block align-top mr-1" src="../../../assets/runebook_logo.webp" width="24" height="24">
                            Runebook.dev
                        </a>
                        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                            <span class="navbar-toggler-icon"></span>
                        </button>
                        <div class="collapse navbar-collapse" id="navbarSupportedContent">
                            <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                                <li class="nav-item">
                                    <a class="nav-link" href="https://runebook.dev/ru#docs">Documentation</a>
                                </li>
                                <li class="nav-item">
                                    <a class="nav-link" href="https://runebook.dev/contributors">Contributors</a>
                                </li>
                                <li class="nav-item">
                                    <a class="nav-link" href="https://github.com/runebookdev/runebook/issues">GitHub</a>
                                </li>
                            </ul>
                                                                                                <button class="btn btn-success ms-2" id="showPopupButton">
                                        <i class="bi bi-translate"></i>
                                        Show English
                                    </button>
                                                                                        <div class="form-check form-switch ms-3">
                                <label class="text-light">
                                    <input class="form-check-input" type="checkbox" role="switch" id="theme-switch" checked>
                                    <i class="bi bi-moon-stars-fill"></i>
                                </label>
                            </div>
                        </div>
                    </nav>
                </div>
            </div>
        </div>
    </header>

    <!--sse-->
    <div class="container">
    <div class="row">
        <div class="col">
            <nav aria-label="breadcrumb" class="mt-2">
                <ol class="breadcrumb mb-1">
                    <li class="breadcrumb-item">
                        <a href="https://runebook.dev/ru#docs">
                            <span class="fi fi-ru"></span>                            Русский                        </a>
                    </li>
                    <li class="breadcrumb-item">
                        <a href="-index-.html">
                            Git                            2.43                        </a>
                    </li>
                                            <li class="breadcrumb-item">
                            <a href="-index-.html#Git">
                                Git                            </a>
                        </li>
                                    </ol>
            </nav>
        </div>
    </div>
    <br>

    <div class="row">
        <div class="col-md-9">
            <main>
                <article>

                    
                    <h1 class="text-body-emphasis" ><span data-i18n="02c09a0ab651834b271857265ed0ba6d7466b413c5f9c59d1691f22c3793f92a/18" data-source="git-bisect-lk2009" onmousemove="i18n(this)">git-bisect-lk2009</span></h1> <h2 class="text-body-emphasis"  id="_abstract"><span data-i18n="d21b4a64a2d8656a0fdf7ab2e89a49164ac504686cfa2a3d442e87c209286330/db" data-source="Abstract" onmousemove="i18n(this)">Abstract</span></h2> <div> <p><span data-i18n="4fad63a3d8ff4602c1c63715ce9b746924efae7ae6334ea24987bb9e15eeec98/68" data-source="&amp;quot;git bisect&amp;quot; enables software users and developers to easily find the commit that introduced a regression. We show why it is important to have good tools to fight regressions. We describe how &amp;quot;git bisect&amp;quot; works from the outside and the algorithms it uses inside. Then we explain how to take advantage of &amp;quot;git bisect&amp;quot; to improve current practices. And we discuss how &amp;quot;git bisect&amp;quot; could improve in the future." onmousemove="i18n(this)">&quot;git bisect&quot;  &pcy;&ocy;&zcy;&vcy;&ocy;&lcy;&yacy;&iecy;&tcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yacy;&mcy; &icy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&acy;&mcy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy; &lcy;&iecy;&gcy;&kcy;&ocy; &ncy;&acy;&khcy;&ocy;&dcy;&icy;&tcy;&softcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &vcy;&ycy;&zcy;&vcy;&acy;&vcy;&shcy;&icy;&jcy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yucy;. &Mcy;&ycy; &pcy;&ocy;&kcy;&acy;&zcy;&ycy;&vcy;&acy;&iecy;&mcy;, &pcy;&ocy;&chcy;&iecy;&mcy;&ucy; &vcy;&acy;&zhcy;&ncy;&ocy; &icy;&mcy;&iecy;&tcy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&iecy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy;&ycy; &dcy;&lcy;&yacy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&iecy;&jcy;. &Ocy;&pcy;&icy;&shcy;&iecy;&mcy;, &kcy;&acy;&kcy;  &quot;git bisect&quot;  &rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy; &scy;&ncy;&acy;&rcy;&ucy;&zhcy;&icy; &icy; &kcy;&acy;&kcy;&icy;&iecy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&ycy; &ocy;&ncy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy; &vcy;&ncy;&ucy;&tcy;&rcy;&icy;. &Zcy;&acy;&tcy;&iecy;&mcy; &mcy;&ycy; &ocy;&bcy;&hardcy;&yacy;&scy;&ncy;&icy;&mcy;, &kcy;&acy;&kcy; &vcy;&ocy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;&scy;&yacy; &pcy;&rcy;&iecy;&icy;&mcy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&acy;&mcy;&icy;  &quot;git bisect&quot;  &dcy;&lcy;&yacy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&yacy; &tcy;&iecy;&kcy;&ucy;&shchcy;&icy;&khcy; &pcy;&rcy;&acy;&kcy;&tcy;&icy;&kcy;. &Icy; &mcy;&ycy; &ocy;&bcy;&scy;&ucy;&zhcy;&dcy;&acy;&iecy;&mcy;, &kcy;&acy;&kcy;  &quot;git bisect&quot;  &mcy;&ocy;&zhcy;&iecy;&tcy; &ucy;&lcy;&ucy;&chcy;&shcy;&icy;&tcy;&softcy;&scy;&yacy; &vcy; &bcy;&ucy;&dcy;&ucy;&shchcy;&iecy;&mcy;.</span></p> </div> <h2 class="text-body-emphasis"  id="_introduction_to_git_bisect"><span data-i18n="d2c02a65197a0c921d04630acd0e8feee345ed23ded31bd1afc6e53f1dae2008/7e" data-source="Introduction to &amp;quot;git bisect&amp;quot;" onmousemove="i18n(this)">&Zcy;&ncy;&acy;&kcy;&ocy;&mcy;&scy;&tcy;&vcy;&ocy; &scy;  &quot;git bisect&quot;</span></h2> <div> <p><span data-i18n="9ae510e8e0517aed5bdf06b50f68f318e98ed299e4825198a4365147f82b1ef3/4c" data-source="Git is a Distributed Version Control system (DVCS) created by Linus Torvalds and maintained by Junio Hamano." onmousemove="i18n(this)">Git  &mdash; &ecy;&tcy;&ocy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&acy; &rcy;&acy;&scy;&pcy;&rcy;&iecy;&dcy;&iecy;&lcy;&iecy;&ncy;&ncy;&ocy;&gcy;&ocy; &kcy;&ocy;&ncy;&tcy;&rcy;&ocy;&lcy;&yacy; &vcy;&iecy;&rcy;&scy;&icy;&jcy; (DVCS), &scy;&ocy;&zcy;&dcy;&acy;&ncy;&ncy;&acy;&yacy; &Lcy;&icy;&ncy;&ucy;&scy;&ocy;&mcy; &Tcy;&ocy;&rcy;&vcy;&acy;&lcy;&softcy;&dcy;&scy;&ocy;&mcy; &icy; &pcy;&ocy;&dcy;&dcy;&iecy;&rcy;&zhcy;&icy;&vcy;&acy;&iecy;&mcy;&acy;&yacy; &Dcy;&zhcy;&ucy;&ncy;&icy;&ocy; &KHcy;&acy;&mcy;&acy;&ncy;&ocy;.</span></p> <p><span data-i18n="2b9afd084fa6f5279a0b60c3d7ab08cd2c2c4a0fda695704fe0795ab5f78925f/c9" data-source="In Git like in many other Version Control Systems (VCS), the different states of the data that is managed by the system are called commits. And, as VCS are mostly used to manage software source code, sometimes &amp;quot;interesting&amp;quot; changes of behavior in the software are introduced in some commits." onmousemove="i18n(this)">&Vcy;  Git , &kcy;&acy;&kcy; &icy; &vcy;&ocy; &mcy;&ncy;&ocy;&gcy;&icy;&khcy; &dcy;&rcy;&ucy;&gcy;&icy;&khcy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&acy;&khcy; &kcy;&ocy;&ncy;&tcy;&rcy;&ocy;&lcy;&yacy; &vcy;&iecy;&rcy;&scy;&icy;&jcy; (VCS), &rcy;&acy;&zcy;&lcy;&icy;&chcy;&ncy;&ycy;&iecy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&yacy; &dcy;&acy;&ncy;&ncy;&ycy;&khcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&mcy;&icy; &ucy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&iecy;&tcy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&acy;, &ncy;&acy;&zcy;&ycy;&vcy;&acy;&yucy;&tcy;&scy;&yacy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yacy;&mcy;&icy;. &Icy; &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; VCS &vcy; &ocy;&scy;&ncy;&ocy;&vcy;&ncy;&ocy;&mcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yucy;&tcy;&scy;&yacy; &dcy;&lcy;&yacy; &ucy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&yacy; &icy;&scy;&khcy;&ocy;&dcy;&ncy;&ycy;&mcy; &kcy;&ocy;&dcy;&ocy;&mcy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;, &icy;&ncy;&ocy;&gcy;&dcy;&acy; &vcy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&khcy; &vcy;&ncy;&ocy;&scy;&yacy;&tcy;&scy;&yacy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&vcy;&iecy;&dcy;&iecy;&ncy;&icy;&yacy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;  &quot;interesting&quot; .</span></p> <p><span data-i18n="3ce9161d9947b51cd43b600fe3c133fbc8b0a913914a85fb94de80123cb5873e/8a" data-source="In fact people are specially interested in commits that introduce a &amp;quot;bad&amp;quot; behavior, called a bug or a regression. They are interested in these commits because a commit (hopefully) contains a very small set of source code changes. And it&amp;rsquo;s much easier to understand and properly fix a problem when you only need to check a very small set of changes, than when you don&amp;rsquo;t know where look in the first place." onmousemove="i18n(this)">&Ncy;&acy; &scy;&acy;&mcy;&ocy;&mcy; &dcy;&iecy;&lcy;&iecy; &lcy;&yucy;&dcy;&iecy;&jcy; &ocy;&scy;&ocy;&bcy;&iecy;&ncy;&ncy;&ocy; &icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ucy;&yucy;&tcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &vcy;&vcy;&ocy;&dcy;&yacy;&tcy; &pcy;&ocy;&vcy;&iecy;&dcy;&iecy;&ncy;&icy;&iecy;  &quot;bad&quot; , &ncy;&acy;&zcy;&ycy;&vcy;&acy;&iecy;&mcy;&ocy;&iecy; &ocy;&shcy;&icy;&bcy;&kcy;&ocy;&jcy; &icy;&lcy;&icy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&iecy;&jcy;. &Ocy;&ncy;&icy; &zcy;&acy;&icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ocy;&vcy;&acy;&ncy;&ycy; &vcy; &ecy;&tcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&khcy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; (&ncy;&acy;&dcy;&iecy;&yucy;&scy;&softcy;) &scy;&ocy;&dcy;&iecy;&rcy;&zhcy;&icy;&tcy; &ocy;&chcy;&iecy;&ncy;&softcy; &ncy;&iecy;&bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&jcy; &ncy;&acy;&bcy;&ocy;&rcy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&jcy; &icy;&scy;&khcy;&ocy;&dcy;&ncy;&ocy;&gcy;&ocy; &kcy;&ocy;&dcy;&acy;. &Icy; &gcy;&ocy;&rcy;&acy;&zcy;&dcy;&ocy; &lcy;&iecy;&gcy;&chcy;&iecy; &pcy;&ocy;&ncy;&yacy;&tcy;&softcy; &icy; &pcy;&rcy;&acy;&vcy;&icy;&lcy;&softcy;&ncy;&ocy; &ucy;&scy;&tcy;&rcy;&acy;&ncy;&icy;&tcy;&softcy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&ucy;, &kcy;&ocy;&gcy;&dcy;&acy; &vcy;&acy;&mcy; &ncy;&ucy;&zhcy;&ncy;&ocy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&icy;&tcy;&softcy; &lcy;&icy;&shcy;&softcy; &ocy;&chcy;&iecy;&ncy;&softcy; &ncy;&iecy;&bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&jcy; &ncy;&acy;&bcy;&ocy;&rcy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&jcy;, &chcy;&iecy;&mcy; &kcy;&ocy;&gcy;&dcy;&acy; &vcy;&ycy; &vcy;&ocy;&ocy;&bcy;&shchcy;&iecy; &ncy;&iecy; &zcy;&ncy;&acy;&iecy;&tcy;&iecy;, &gcy;&dcy;&iecy; &icy;&scy;&kcy;&acy;&tcy;&softcy;.</span></p> <p><span data-i18n="faf09d8656d30a8a9ca3dfbbe94ea39a64663dfaab595a1d2e33942a7b7c3846/92" data-source="So to help people find commits that introduce a &amp;quot;bad&amp;quot; behavior, the &amp;quot;git bisect&amp;quot; set of commands was invented. And it follows of course that in &amp;quot;git bisect&amp;quot; parlance, commits where the &amp;quot;interesting behavior&amp;quot; is present are called &amp;quot;bad&amp;quot; commits, while other commits are called &amp;quot;good&amp;quot; commits. And a commit that introduce the behavior we are interested in is called a &amp;quot;first bad commit&amp;quot;. Note that there could be more than one &amp;quot;first bad commit&amp;quot; in the commit space we are searching." onmousemove="i18n(this)">&Pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy;, &chcy;&tcy;&ocy;&bcy;&ycy; &pcy;&ocy;&mcy;&ocy;&chcy;&softcy; &lcy;&yucy;&dcy;&yacy;&mcy; &ncy;&acy;&jcy;&tcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &vcy;&vcy;&ocy;&dcy;&yacy;&tcy; &pcy;&ocy;&vcy;&iecy;&dcy;&iecy;&ncy;&icy;&iecy;  &quot;bad&quot; , &bcy;&ycy;&lcy; &icy;&zcy;&ocy;&bcy;&rcy;&iecy;&tcy;&iecy;&ncy; &ncy;&acy;&bcy;&ocy;&rcy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;  &quot;git bisect&quot; . &Icy;&zcy; &ecy;&tcy;&ocy;&gcy;&ocy;, &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy; &zhcy;&iecy;, &scy;&lcy;&iecy;&dcy;&ucy;&iecy;&tcy;, &chcy;&tcy;&ocy; &ncy;&acy; &yacy;&zcy;&ycy;&kcy;&iecy;  &quot;git bisect&quot;  &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &vcy; &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy; &pcy;&rcy;&icy;&scy;&ucy;&tcy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy;  &quot;interesting behavior&quot; , &ncy;&acy;&zcy;&ycy;&vcy;&acy;&yucy;&tcy;&scy;&yacy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&mcy;&icy;  &quot;bad&quot; , &acy; &dcy;&rcy;&ucy;&gcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &ncy;&acy;&zcy;&ycy;&vcy;&acy;&yucy;&tcy;&scy;&yacy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&mcy;&icy;  &quot;good&quot; . &Icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &vcy;&vcy;&ocy;&dcy;&icy;&tcy; &icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ucy;&yucy;&shchcy;&iecy;&iecy; &ncy;&acy;&scy; &pcy;&ocy;&vcy;&iecy;&dcy;&iecy;&ncy;&icy;&iecy;, &ncy;&acy;&zcy;&ycy;&vcy;&acy;&iecy;&tcy;&scy;&yacy;  &quot;first bad commit&quot; . &Ocy;&bcy;&rcy;&acy;&tcy;&icy;&tcy;&iecy; &vcy;&ncy;&icy;&mcy;&acy;&ncy;&icy;&iecy;, &chcy;&tcy;&ocy; &vcy; &icy;&scy;&kcy;&ocy;&mcy;&ocy;&mcy; &pcy;&rcy;&ocy;&scy;&tcy;&rcy;&acy;&ncy;&scy;&tcy;&vcy;&iecy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&icy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &bcy;&ocy;&lcy;&iecy;&iecy; &ocy;&dcy;&ncy;&ocy;&gcy;&ocy;  &quot;first bad commit&quot; .</span></p> <p><span data-i18n="95b0c6bda906cdf82189709945b654fd1186b4ac472004ba2df9feb7c5ef7599/6b" data-source="So &amp;quot;git bisect&amp;quot; is designed to help find a &amp;quot;first bad commit&amp;quot;. And to be as efficient as possible, it tries to perform a binary search." onmousemove="i18n(this)">&Tcy;&acy;&kcy; &vcy;&ocy;&tcy;  &quot;git bisect&quot;  &pcy;&rcy;&icy;&zcy;&vcy;&acy;&ncy; &pcy;&ocy;&mcy;&ocy;&chcy;&softcy; &ncy;&acy;&jcy;&tcy;&icy;  &quot;first bad commit&quot; . &Icy; &chcy;&tcy;&ocy;&bcy;&ycy; &bcy;&ycy;&tcy;&softcy; &mcy;&acy;&kcy;&scy;&icy;&mcy;&acy;&lcy;&softcy;&ncy;&ocy; &ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&ycy;&mcy;, &ocy;&ncy; &pcy;&ycy;&tcy;&acy;&iecy;&tcy;&scy;&yacy; &vcy;&ycy;&pcy;&ocy;&lcy;&ncy;&icy;&tcy;&softcy; &dcy;&vcy;&ocy;&icy;&chcy;&ncy;&ycy;&jcy; &pcy;&ocy;&icy;&scy;&kcy;.</span></p> </div> <h2 class="text-body-emphasis"  id="_fighting_regressions_overview"><span data-i18n="aeb45ba9ce5c0df46bedeec1ce3b1b6c4181a8741b45f8b901828512ac5d3feb/e9" data-source="Fighting regressions overview" onmousemove="i18n(this)">&Ocy;&bcy;&zcy;&ocy;&rcy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&iecy;&jcy;</span></h2> <div> <div> <h3 class="text-body-emphasis"  id="_regressions_a_big_problem"><span data-i18n="d7a171952f1a980e8897503ca67d54f50935e9b2610610cfac6a2bee80608fdd/d8" data-source="Regressions: a big problem" onmousemove="i18n(this)">&Rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&icy;: &bcy;&ocy;&lcy;&softcy;&shcy;&acy;&yacy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&acy;</span></h3> <p><span data-i18n="191a66a173b24238f1889bcec3b03b9dbb6f5fe10683bd48dcd19dfff83a26bd/36" data-source="Regressions are a big problem in the software industry. But it&amp;rsquo;s difficult to put some real numbers behind that claim." onmousemove="i18n(this)">&Rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&icy; &mdash; &bcy;&ocy;&lcy;&softcy;&shcy;&acy;&yacy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&acy; &vcy; &icy;&ncy;&dcy;&ucy;&scy;&tcy;&rcy;&icy;&icy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;. &Ncy;&ocy; &tcy;&rcy;&ucy;&dcy;&ncy;&ocy; &pcy;&ocy;&dcy;&kcy;&rcy;&iecy;&pcy;&icy;&tcy;&softcy; &ecy;&tcy;&ocy; &ucy;&tcy;&vcy;&iecy;&rcy;&zhcy;&dcy;&iecy;&ncy;&icy;&iecy; &kcy;&acy;&kcy;&icy;&mcy;&icy;-&tcy;&ocy; &rcy;&iecy;&acy;&lcy;&softcy;&ncy;&ycy;&mcy;&icy; &tscy;&icy;&fcy;&rcy;&acy;&mcy;&icy;.</span></p> <p><span data-i18n="a6c8d8c5a6c530923e4dbe9bd0801d6f6f92fbce1478873cde25b922aa81d050/bd" data-source="There are some numbers about bugs in general, like a NIST study in 2002 &lt;a href=&quot;#1&quot;&gt;[1]&lt;/a&gt; that said:" onmousemove="i18n(this)">&IEcy;&scy;&tcy;&softcy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &tscy;&icy;&fcy;&rcy;&ycy; &ocy;&bcy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;&khcy; &vcy; &tscy;&iecy;&lcy;&ocy;&mcy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &icy;&scy;&scy;&lcy;&iecy;&dcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; NIST  <a href="git-bisect-lk2009.html#1">[1]</a>  2002 &gcy;&ocy;&dcy;&acy;, &vcy; &kcy;&ocy;&tcy;&ocy;&rcy;&ocy;&mcy; &gcy;&ocy;&vcy;&ocy;&rcy;&icy;&tcy;&scy;&yacy;:</span></p> <div> <blockquote> <p><span data-i18n="cb2d6556f230f3deeddb53767893523bd54a04a0b99ccab5620c4e6c0d5e87c1/98" data-source="Software bugs, or errors, are so prevalent and so detrimental that they cost the U.S. economy an estimated $59.5 billion annually, or about 0.6 percent of the gross domestic product, according to a newly released study commissioned by the Department of Commerce&amp;rsquo;s National Institute of Standards and Technology (NIST). At the national level, over half of the costs are borne by software users and the remainder by software developers/vendors. The study also found that, although all errors cannot be removed, more than a third of these costs, or an estimated $22.2 billion, could be eliminated by an improved testing infrastructure that enables earlier and more effective identification and removal of software defects. These are the savings associated with finding an increased percentage (but not 100 percent) of errors closer to the development stages in which they are introduced. Currently, over half of all errors are not found until &amp;quot;downstream&amp;quot; in the development process or during post-sale software use." onmousemove="i18n(this)">&Scy;&ocy;&gcy;&lcy;&acy;&scy;&ncy;&ocy; &ncy;&iecy;&dcy;&acy;&vcy;&ncy;&ocy; &ocy;&pcy;&ucy;&bcy;&lcy;&icy;&kcy;&ocy;&vcy;&acy;&ncy;&ncy;&ocy;&mcy;&ucy; &icy;&scy;&scy;&lcy;&iecy;&dcy;&ocy;&vcy;&acy;&ncy;&icy;&yucy;, &pcy;&rcy;&ocy;&vcy;&iecy;&dcy;&iecy;&ncy;&ncy;&ocy;&mcy;&ucy; &pcy;&ocy; &zcy;&acy;&kcy;&acy;&zcy;&ucy; &Ncy;&acy;&tscy;&icy;&ocy;&ncy;&acy;&lcy;&softcy;&ncy;&ocy;&gcy;&ocy; &icy;&ncy;&scy;&tcy;&icy;&tcy;&ucy;&tcy;&acy; &scy;&tcy;&acy;&ncy;&dcy;&acy;&rcy;&tcy;&ocy;&vcy; &Mcy;&icy;&ncy;&icy;&scy;&tcy;&iecy;&rcy;&scy;&tcy;&vcy;&acy; &tcy;&ocy;&rcy;&gcy;&ocy;&vcy;&lcy;&icy;, &scy;&bcy;&ocy;&icy; &vcy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&mcy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&icy; &icy;&lcy;&icy; &ocy;&shcy;&icy;&bcy;&kcy;&icy; &ncy;&acy;&scy;&tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &rcy;&acy;&scy;&pcy;&rcy;&ocy;&scy;&tcy;&rcy;&acy;&ncy;&iecy;&ncy;&ycy; &icy; &ncy;&acy;&scy;&tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &vcy;&rcy;&iecy;&dcy;&ncy;&ycy;, &chcy;&tcy;&ocy; &ocy;&ncy;&icy; &ocy;&bcy;&khcy;&ocy;&dcy;&yacy;&tcy;&scy;&yacy; &ecy;&kcy;&ocy;&ncy;&ocy;&mcy;&icy;&kcy;&iecy; &Scy;&SHcy;&Acy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&ncy;&ocy; &vcy; 59,5 &mcy;&icy;&lcy;&lcy;&icy;&acy;&rcy;&dcy;&ocy;&vcy; &dcy;&ocy;&lcy;&lcy;&acy;&rcy;&ocy;&vcy; &vcy; &gcy;&ocy;&dcy;, &icy;&lcy;&icy; &ocy;&kcy;&ocy;&lcy;&ocy; 0,6 &pcy;&rcy;&ocy;&tscy;&iecy;&ncy;&tcy;&acy; &vcy;&acy;&lcy;&ocy;&vcy;&ocy;&gcy;&ocy; &vcy;&ncy;&ucy;&tcy;&rcy;&iecy;&ncy;&ncy;&iecy;&gcy;&ocy; &pcy;&rcy;&ocy;&dcy;&ucy;&kcy;&tcy;&acy;. &icy; &tcy;&iecy;&khcy;&ncy;&ocy;&lcy;&ocy;&gcy;&icy;&icy; (&Ncy;&Icy;&Scy;&Tcy;). &Ncy;&acy; &ncy;&acy;&tscy;&icy;&ocy;&ncy;&acy;&lcy;&softcy;&ncy;&ocy;&mcy; &ucy;&rcy;&ocy;&vcy;&ncy;&iecy; &bcy;&ocy;&lcy;&iecy;&iecy; &pcy;&ocy;&lcy;&ocy;&vcy;&icy;&ncy;&ycy; &zcy;&acy;&tcy;&rcy;&acy;&tcy; &ncy;&iecy;&scy;&ucy;&tcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&icy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;, &acy; &ocy;&scy;&tcy;&acy;&vcy;&shcy;&ucy;&yucy;&scy;&yacy; &chcy;&acy;&scy;&tcy;&softcy; &mdash; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&icy;/&pcy;&ocy;&scy;&tcy;&acy;&vcy;&shchcy;&icy;&kcy;&icy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;. &Icy;&scy;&scy;&lcy;&iecy;&dcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; &tcy;&acy;&kcy;&zhcy;&iecy; &pcy;&ocy;&kcy;&acy;&zcy;&acy;&lcy;&ocy;, &chcy;&tcy;&ocy;, &khcy;&ocy;&tcy;&yacy; &vcy;&scy;&iecy; &ocy;&shcy;&icy;&bcy;&kcy;&icy; &ncy;&iecy;&vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy; &ucy;&scy;&tcy;&rcy;&acy;&ncy;&icy;&tcy;&softcy;, &bcy;&ocy;&lcy;&iecy;&iecy; &tcy;&rcy;&iecy;&tcy;&icy; &ecy;&tcy;&icy;&khcy; &zcy;&acy;&tcy;&rcy;&acy;&tcy;, &icy;&lcy;&icy;, &pcy;&ocy; &ocy;&tscy;&iecy;&ncy;&kcy;&acy;&mcy;, 22,2 &mcy;&icy;&lcy;&lcy;&icy;&acy;&rcy;&dcy;&acy; &dcy;&ocy;&lcy;&lcy;&acy;&rcy;&ocy;&vcy;, &mcy;&ocy;&zhcy;&ncy;&ocy; &ucy;&scy;&tcy;&rcy;&acy;&ncy;&icy;&tcy;&softcy; &zcy;&acy; &scy;&chcy;&iecy;&tcy; &ucy;&scy;&ocy;&vcy;&iecy;&rcy;&shcy;&iecy;&ncy;&scy;&tcy;&vcy;&ocy;&vcy;&acy;&ncy;&ncy;&ocy;&jcy; &icy;&ncy;&fcy;&rcy;&acy;&scy;&tcy;&rcy;&ucy;&kcy;&tcy;&ucy;&rcy;&ycy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy;, &kcy;&ocy;&tcy;&ocy;&rcy;&acy;&yacy; &pcy;&ocy;&zcy;&vcy;&ocy;&lcy;&yacy;&iecy;&tcy; &rcy;&acy;&ncy;&softcy;&shcy;&iecy; &icy; &bcy;&ocy;&lcy;&iecy;&iecy; &ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&ocy; &vcy;&ycy;&yacy;&vcy;&lcy;&yacy;&tcy;&softcy; &icy; &ucy;&scy;&tcy;&rcy;&acy;&ncy;&yacy;&tcy;&softcy; &dcy;&iecy;&fcy;&iecy;&kcy;&tcy;&ycy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;. &Ecy;&tcy;&ocy; &ecy;&kcy;&ocy;&ncy;&ocy;&mcy;&icy;&yacy;, &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ncy;&acy;&yacy; &scy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&iecy;&ncy;&icy;&iecy;&mcy; &pcy;&ocy;&vcy;&ycy;&shcy;&iecy;&ncy;&ncy;&ocy;&gcy;&ocy; &pcy;&rcy;&ocy;&tscy;&iecy;&ncy;&tcy;&acy; (&ncy;&ocy; &ncy;&iecy; 100 &pcy;&rcy;&ocy;&tscy;&iecy;&ncy;&tcy;&ocy;&vcy;) &ocy;&shcy;&icy;&bcy;&ocy;&kcy; &bcy;&lcy;&icy;&zhcy;&iecy; &kcy; &ecy;&tcy;&acy;&pcy;&acy;&mcy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&icy;, &ncy;&acy; &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy; &ocy;&ncy;&icy; &vcy;&ncy;&ocy;&scy;&yacy;&tcy;&scy;&yacy;. &Vcy; &ncy;&acy;&scy;&tcy;&ocy;&yacy;&shchcy;&iecy;&iecy; &vcy;&rcy;&iecy;&mcy;&yacy; &bcy;&ocy;&lcy;&iecy;&iecy; &pcy;&ocy;&lcy;&ocy;&vcy;&icy;&ncy;&ycy; &vcy;&scy;&iecy;&khcy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy; &ncy;&iecy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&icy;&vcy;&acy;&yucy;&tcy;&scy;&yacy; &dcy;&ocy; &pcy;&ocy;&yacy;&vcy;&lcy;&iecy;&ncy;&icy;&yacy;  &quot;downstream&quot;  &vcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;&iecy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&icy; &icy;&lcy;&icy; &pcy;&ocy;&scy;&lcy;&iecy;&pcy;&rcy;&ocy;&dcy;&acy;&zhcy;&ncy;&ocy;&gcy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;.</span></p> </blockquote> </div> <p><span data-i18n="00a90a8be3dd30b3e25498356bf7e493a2c05a97a646583363ddd7bf79782c47/fc" data-source="And then:" onmousemove="i18n(this)">And then:</span></p> <div> <blockquote> <p><span data-i18n="e3a65d5d5c2f4423f22d036d43db568039772644cb5743f67047702db4fcda09/96" data-source="Software developers already spend approximately 80 percent of development costs on identifying and correcting defects, and yet few products of any type other than software are shipped with such high levels of errors." onmousemove="i18n(this)">&Rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&icy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy; &ucy;&zhcy;&iecy; &tcy;&rcy;&acy;&tcy;&yacy;&tcy; &ocy;&kcy;&ocy;&lcy;&ocy; 80 &pcy;&rcy;&ocy;&tscy;&iecy;&ncy;&tcy;&ocy;&vcy; &zcy;&acy;&tcy;&rcy;&acy;&tcy; &ncy;&acy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&ucy; &ncy;&acy; &vcy;&ycy;&yacy;&vcy;&lcy;&iecy;&ncy;&icy;&iecy; &icy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&iecy; &dcy;&iecy;&fcy;&iecy;&kcy;&tcy;&ocy;&vcy;, &icy; &tcy;&iecy;&mcy; &ncy;&iecy; &mcy;&iecy;&ncy;&iecy;&iecy; &lcy;&icy;&shcy;&softcy; &ncy;&iecy;&mcy;&ncy;&ocy;&gcy;&icy;&iecy; &pcy;&rcy;&ocy;&dcy;&ucy;&kcy;&tcy;&ycy; &lcy;&yucy;&bcy;&ocy;&gcy;&ocy; &tcy;&icy;&pcy;&acy;, &kcy;&rcy;&ocy;&mcy;&iecy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;, &pcy;&ocy;&scy;&tcy;&acy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &scy; &tcy;&acy;&kcy;&icy;&mcy; &vcy;&ycy;&scy;&ocy;&kcy;&icy;&mcy; &ucy;&rcy;&ocy;&vcy;&ncy;&iecy;&mcy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;.</span></p> </blockquote> </div> <p><span data-i18n="0061498423887514e1b45f889312ea9a37f7c4e8374e83612ca75d96097d6aab/17" data-source="Eventually the conclusion started with:" onmousemove="i18n(this)">&Vcy; &kcy;&ocy;&ncy;&tscy;&iecy; &kcy;&ocy;&ncy;&tscy;&ocy;&vcy; &zcy;&acy;&kcy;&lcy;&yucy;&chcy;&iecy;&ncy;&icy;&iecy; &ncy;&acy;&chcy;&acy;&lcy;&ocy;&scy;&softcy; &scy;&ocy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&icy;&khcy; &scy;&lcy;&ocy;&vcy;:</span></p> <div> <blockquote> <p><span data-i18n="cc7d8c357c161f648023497be6a27f5e1bac4701feb0042d486157c9ea14dfff/98" data-source="The path to higher software quality is significantly improved software testing." onmousemove="i18n(this)">&Pcy;&ucy;&tcy;&softcy; &kcy; &bcy;&ocy;&lcy;&iecy;&iecy; &vcy;&ycy;&scy;&ocy;&kcy;&ocy;&mcy;&ucy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&ucy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy; &lcy;&iecy;&zhcy;&icy;&tcy; &vcy; &zcy;&ncy;&acy;&chcy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy;&mcy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&icy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;.</span></p> </blockquote> </div> <p><span data-i18n="0a8c2ed9b281285fc2ddacfb00dc24ca221ac0e50e1ed29db2e5f67d32670b63/71" data-source="There are other estimates saying that 80% of the cost related to software is about maintenance &lt;a href=&quot;#2&quot;&gt;[2]&lt;/a&gt;." onmousemove="i18n(this)">&Pcy;&ocy; &dcy;&rcy;&ucy;&gcy;&icy;&mcy; &ocy;&tscy;&iecy;&ncy;&kcy;&acy;&mcy;, 80% &zcy;&acy;&tcy;&rcy;&acy;&tcy; &ncy;&acy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&iecy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&iecy; &pcy;&rcy;&icy;&khcy;&ocy;&dcy;&icy;&tcy;&scy;&yacy; &ncy;&acy; &ocy;&bcy;&scy;&lcy;&ucy;&zhcy;&icy;&vcy;&acy;&ncy;&icy;&iecy;  <a href="git-bisect-lk2009.html#2">[2]</a> .</span></p> <p><span data-i18n="ba7b809656a096c6062faa7975e39fce01145b8707d29577f2c2969f477a519d/0e" data-source="Though, according to Wikipedia &lt;a href=&quot;#3&quot;&gt;[3]&lt;/a&gt;:" onmousemove="i18n(this)">&KHcy;&ocy;&tcy;&yacy;, &scy;&ocy;&gcy;&lcy;&acy;&scy;&ncy;&ocy; &Vcy;&icy;&kcy;&icy;&pcy;&iecy;&dcy;&icy;&icy;  <a href="git-bisect-lk2009.html#3">[3]</a> :</span></p> <div> <blockquote> <p><span data-i18n="e760aadf0780a4bd3dbee2659fa34cfd3af51e5e65bd790621f61ea2aabd58d9/84" data-source="A common perception of maintenance is that it is merely fixing bugs. However, studies and surveys over the years have indicated that the majority, over 80%, of the maintenance effort is used for non-corrective actions (Pigosky 1997). This perception is perpetuated by users submitting problem reports that in reality are functionality enhancements to the system." onmousemove="i18n(this)">&Rcy;&acy;&scy;&pcy;&rcy;&ocy;&scy;&tcy;&rcy;&acy;&ncy;&iecy;&ncy;&ocy; &mcy;&ncy;&iecy;&ncy;&icy;&iecy;, &chcy;&tcy;&ocy; &ocy;&bcy;&scy;&lcy;&ucy;&zhcy;&icy;&vcy;&acy;&ncy;&icy;&iecy; &mdash; &ecy;&tcy;&ocy; &pcy;&rcy;&ocy;&scy;&tcy;&ocy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&iecy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;. &Ocy;&dcy;&ncy;&acy;&kcy;&ocy; &icy;&scy;&scy;&lcy;&iecy;&dcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; &icy; &ocy;&pcy;&rcy;&ocy;&scy;&ycy;, &pcy;&rcy;&ocy;&vcy;&ocy;&dcy;&icy;&vcy;&shcy;&icy;&iecy;&scy;&yacy; &ncy;&acy; &pcy;&rcy;&ocy;&tcy;&yacy;&zhcy;&iecy;&ncy;&icy;&icy; &mcy;&ncy;&ocy;&gcy;&icy;&khcy; &lcy;&iecy;&tcy;, &pcy;&ocy;&kcy;&acy;&zcy;&acy;&lcy;&icy;, &chcy;&tcy;&ocy; &bcy;&ocy;&lcy;&softcy;&shcy;&acy;&yacy; &chcy;&acy;&scy;&tcy;&softcy;, &bcy;&ocy;&lcy;&iecy;&iecy; 80% &ucy;&scy;&icy;&lcy;&icy;&jcy; &pcy;&ocy; &tcy;&iecy;&khcy;&ncy;&icy;&chcy;&iecy;&scy;&kcy;&ocy;&mcy;&ucy; &ocy;&bcy;&scy;&lcy;&ucy;&zhcy;&icy;&vcy;&acy;&ncy;&icy;&yucy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy;&scy;&yacy; &dcy;&lcy;&yacy; &ncy;&iecy;&kcy;&ocy;&rcy;&rcy;&iecy;&kcy;&tcy;&icy;&rcy;&ucy;&yucy;&shchcy;&icy;&khcy; &dcy;&iecy;&jcy;&scy;&tcy;&vcy;&icy;&jcy; (&Pcy;&icy;&gcy;&ocy;&scy;&kcy;&icy;, 1997). &Tcy;&acy;&kcy;&ocy;&iecy; &mcy;&ncy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&dcy;&dcy;&iecy;&rcy;&zhcy;&icy;&vcy;&acy;&iecy;&tcy;&scy;&yacy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yacy;&mcy;&icy;, &ocy;&tcy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&yucy;&shchcy;&icy;&mcy;&icy; &ocy;&tcy;&chcy;&iecy;&tcy;&ycy; &ocy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&acy;&khcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ncy;&acy; &scy;&acy;&mcy;&ocy;&mcy; &dcy;&iecy;&lcy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&yacy;&mcy;&icy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&ocy;&ncy;&acy;&lcy;&softcy;&ncy;&ocy;&scy;&tcy;&icy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&ycy;.</span></p> </blockquote> </div> <p><span data-i18n="f9ab5a46d0aae16bdafa306fdb0613a480e54c4b4405bb433e2a1df242cca2e4/08" data-source="But we can guess that improving on existing software is very costly because you have to watch out for regressions. At least this would make the above studies consistent among themselves." onmousemove="i18n(this)">&Ncy;&ocy; &mcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&mcy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&ocy;&zhcy;&icy;&tcy;&softcy;, &chcy;&tcy;&ocy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&iecy; &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&yucy;&shchcy;&iecy;&gcy;&ocy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy; &ocy;&bcy;&khcy;&ocy;&dcy;&icy;&tcy;&scy;&yacy; &ocy;&chcy;&iecy;&ncy;&softcy; &dcy;&ocy;&rcy;&ocy;&gcy;&ocy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ncy;&iecy;&ocy;&bcy;&khcy;&ocy;&dcy;&icy;&mcy;&ocy; &scy;&lcy;&iecy;&dcy;&icy;&tcy;&softcy; &zcy;&acy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&acy;&mcy;&icy;. &Pcy;&ocy; &kcy;&rcy;&acy;&jcy;&ncy;&iecy;&jcy; &mcy;&iecy;&rcy;&iecy;, &ecy;&tcy;&ocy; &scy;&dcy;&iecy;&lcy;&acy;&lcy;&ocy; &bcy;&ycy; &pcy;&rcy;&icy;&vcy;&iecy;&dcy;&iecy;&ncy;&ncy;&ycy;&iecy; &vcy;&ycy;&shcy;&iecy; &icy;&scy;&scy;&lcy;&iecy;&dcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; &scy;&ocy;&gcy;&lcy;&acy;&scy;&ocy;&vcy;&acy;&ncy;&ncy;&ycy;&mcy;&icy; &mcy;&iecy;&zhcy;&dcy;&ucy; &scy;&ocy;&bcy;&ocy;&jcy;.</span></p> <p><span data-i18n="1448ea1ff06b72baf360be8006d5d2d919a41e964f9e66057b5780d777267377/f2" data-source="Of course some kind of software is developed, then used during some time without being improved on much, and then finally thrown away. In this case, of course, regressions may not be a big problem. But on the other hand, there is a lot of big software that is continually developed and maintained during years or even tens of years by a lot of people. And as there are often many people who depend (sometimes critically) on such software, regressions are a really big problem." onmousemove="i18n(this)">&Kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;, &kcy;&acy;&kcy;&ocy;&iecy;-&tcy;&ocy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&iecy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&iecy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&acy;&tcy;&ycy;&vcy;&acy;&iecy;&tcy;&scy;&yacy;, &zcy;&acy;&tcy;&iecy;&mcy; &kcy;&acy;&kcy;&ocy;&iecy;-&tcy;&ocy; &vcy;&rcy;&iecy;&mcy;&yacy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy;&scy;&yacy; &bcy;&iecy;&zcy; &kcy;&acy;&kcy;&icy;&khcy;-&lcy;&icy;&bcy;&ocy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&jcy;, &acy; &zcy;&acy;&tcy;&iecy;&mcy;, &ncy;&acy;&kcy;&ocy;&ncy;&iecy;&tscy;, &vcy;&ycy;&bcy;&rcy;&acy;&scy;&ycy;&vcy;&acy;&iecy;&tcy;&scy;&yacy;. &Vcy; &ecy;&tcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;, &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;, &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&icy; &ncy;&iecy; &mcy;&ocy;&gcy;&ucy;&tcy; &bcy;&ycy;&tcy;&softcy; &bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&jcy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&ocy;&jcy;. &Ncy;&ocy; &scy; &dcy;&rcy;&ucy;&gcy;&ocy;&jcy; &scy;&tcy;&ocy;&rcy;&ocy;&ncy;&ycy;, &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy; &mcy;&ncy;&ocy;&zhcy;&iecy;&scy;&tcy;&vcy;&ocy; &bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&gcy;&ocy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ocy;&iecy; &pcy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&ncy;&ocy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&acy;&tcy;&ycy;&vcy;&acy;&iecy;&tcy;&scy;&yacy; &icy; &pcy;&ocy;&dcy;&dcy;&iecy;&rcy;&zhcy;&icy;&vcy;&acy;&iecy;&tcy;&scy;&yacy; &vcy; &tcy;&iecy;&chcy;&iecy;&ncy;&icy;&iecy; &mcy;&ncy;&ocy;&gcy;&icy;&khcy; &lcy;&iecy;&tcy; &icy;&lcy;&icy; &dcy;&acy;&zhcy;&iecy; &dcy;&iecy;&scy;&yacy;&tcy;&kcy;&ocy;&vcy; &lcy;&iecy;&tcy; &mcy;&ncy;&ocy;&zhcy;&iecy;&scy;&tcy;&vcy;&ocy;&mcy; &lcy;&yucy;&dcy;&iecy;&jcy;. &Acy; &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ocy;&tcy; &tcy;&acy;&kcy;&ocy;&gcy;&ocy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy; &chcy;&acy;&scy;&tcy;&ocy; &zcy;&acy;&vcy;&icy;&scy;&icy;&tcy; (&icy;&ncy;&ocy;&gcy;&dcy;&acy; &kcy;&rcy;&icy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;) &mcy;&ncy;&ocy;&zhcy;&iecy;&scy;&tcy;&vcy;&ocy; &lcy;&yucy;&dcy;&iecy;&jcy;, &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&icy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &dcy;&iecy;&jcy;&scy;&tcy;&vcy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy; &bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&jcy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&ocy;&jcy;.</span></p> <p><span data-i18n="80a995917d8f442029863457d169b949bc77a7ca0a4b540840d1ca83e2360aa6/7b" data-source="One such software is the Linux kernel. And if we look at the Linux kernel, we can see that a lot of time and effort is spent to fight regressions. The release cycle start with a 2 weeks long merge window. Then the first release candidate (rc) version is tagged. And after that about 7 or 8 more rc versions will appear with around one week between each of them, before the final release." onmousemove="i18n(this)">&Ocy;&dcy;&ncy;&icy;&mcy; &icy;&zcy; &tcy;&acy;&kcy;&icy;&khcy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy; &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &yacy;&dcy;&rcy;&ocy; &ZeroWidthSpace;&ZeroWidthSpace;Linux. &Acy; &iecy;&scy;&lcy;&icy; &mcy;&ycy; &pcy;&ocy;&scy;&mcy;&ocy;&tcy;&rcy;&icy;&mcy; &ncy;&acy; &yacy;&dcy;&rcy;&ocy; &ZeroWidthSpace;&ZeroWidthSpace;Linux, &tcy;&ocy; &ucy;&vcy;&icy;&dcy;&icy;&mcy;, &chcy;&tcy;&ocy; &ncy;&acy; &bcy;&ocy;&rcy;&softcy;&bcy;&ucy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yacy;&mcy;&icy; &tcy;&rcy;&acy;&tcy;&icy;&tcy;&scy;&yacy; &mcy;&ncy;&ocy;&gcy;&ocy; &vcy;&rcy;&iecy;&mcy;&iecy;&ncy;&icy; &icy; &ucy;&scy;&icy;&lcy;&icy;&jcy;. &TScy;&icy;&kcy;&lcy; &vcy;&ycy;&pcy;&ucy;&scy;&kcy;&acy; &ncy;&acy;&chcy;&icy;&ncy;&acy;&iecy;&tcy;&scy;&yacy; &scy; &dcy;&vcy;&ucy;&khcy;&ncy;&iecy;&dcy;&iecy;&lcy;&softcy;&ncy;&ocy;&gcy;&ocy; &ocy;&kcy;&ncy;&acy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy;. &Zcy;&acy;&tcy;&iecy;&mcy; &pcy;&ocy;&mcy;&iecy;&chcy;&acy;&iecy;&tcy;&scy;&yacy; &pcy;&iecy;&rcy;&vcy;&acy;&yacy; &vcy;&iecy;&rcy;&scy;&icy;&yacy;-&kcy;&acy;&ncy;&dcy;&icy;&dcy;&acy;&tcy; &ncy;&acy; &vcy;&ycy;&pcy;&ucy;&scy;&kcy; (rc). &Icy; &pcy;&ocy;&scy;&lcy;&iecy; &ecy;&tcy;&ocy;&gcy;&ocy; &pcy;&ocy;&yacy;&vcy;&yacy;&tcy;&scy;&yacy; &iecy;&shchcy;&iecy; &ocy;&kcy;&ocy;&lcy;&ocy; 7 &icy;&lcy;&icy; 8 rc-&vcy;&iecy;&rcy;&scy;&icy;&jcy; &scy; &icy;&ncy;&tcy;&iecy;&rcy;&vcy;&acy;&lcy;&ocy;&mcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&ncy;&ocy; &vcy; &ncy;&iecy;&dcy;&iecy;&lcy;&yucy; &mcy;&iecy;&zhcy;&dcy;&ucy; &kcy;&acy;&zhcy;&dcy;&ocy;&jcy; &icy;&zcy; &ncy;&icy;&khcy;, &dcy;&ocy; &fcy;&icy;&ncy;&acy;&lcy;&softcy;&ncy;&ocy;&gcy;&ocy; &rcy;&iecy;&lcy;&icy;&zcy;&acy;.</span></p> <p><span data-i18n="9f99826e0b84516336a2e43f702f9b154b7d542bdc266c14869d8f4e08fa47a9/d1" data-source="The time between the first rc release and the final release is supposed to be used to test rc versions and fight bugs and especially regressions. And this time is more than 80% of the release cycle time. But this is not the end of the fight yet, as of course it continues after the release." onmousemove="i18n(this)">&Pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&iecy;&tcy;&scy;&yacy;, &chcy;&tcy;&ocy; &vcy;&rcy;&iecy;&mcy;&yacy; &mcy;&iecy;&zhcy;&dcy;&ucy; &pcy;&iecy;&rcy;&vcy;&ycy;&mcy; &vcy;&ycy;&pcy;&ucy;&scy;&kcy;&ocy;&mcy; rc &icy; &fcy;&icy;&ncy;&acy;&lcy;&softcy;&ncy;&ycy;&mcy; &vcy;&ycy;&pcy;&ucy;&scy;&kcy;&ocy;&mcy; &bcy;&ucy;&dcy;&iecy;&tcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;&scy;&yacy; &dcy;&lcy;&yacy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; &vcy;&iecy;&rcy;&scy;&icy;&jcy; rc &icy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy; &scy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;&mcy;&icy; &icy; &ocy;&scy;&ocy;&bcy;&iecy;&ncy;&ncy;&ocy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&acy;&mcy;&icy;. &Icy; &ecy;&tcy;&ocy; &vcy;&rcy;&iecy;&mcy;&yacy; &scy;&ocy;&scy;&tcy;&acy;&vcy;&lcy;&yacy;&iecy;&tcy; &bcy;&ocy;&lcy;&iecy;&iecy; 80% &vcy;&rcy;&iecy;&mcy;&iecy;&ncy;&icy; &tscy;&icy;&kcy;&lcy;&acy; &rcy;&iecy;&lcy;&icy;&zcy;&acy;. &Ncy;&ocy; &ecy;&tcy;&ocy; &iecy;&shchcy;&iecy; &ncy;&iecy; &kcy;&ocy;&ncy;&iecy;&tscy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ocy;&ncy;&acy;, &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;, &pcy;&rcy;&ocy;&dcy;&ocy;&lcy;&zhcy;&icy;&tcy;&scy;&yacy; &icy; &pcy;&ocy;&scy;&lcy;&iecy; &rcy;&iecy;&lcy;&icy;&zcy;&acy;.</span></p> <p><span data-i18n="6a233a434174981d1e3eb01f11751c8dfc15f2f6f91934c5048d9d6e6ab4c9a1/14" data-source="And then this is what Ingo Molnar (a well known Linux kernel developer) says about his use of git bisect:" onmousemove="i18n(this)">&Acy; &vcy;&ocy;&tcy; &chcy;&tcy;&ocy; &Icy;&ncy;&gcy;&ocy; &Mcy;&ocy;&lcy;&ncy;&acy;&rcy; (&icy;&zcy;&vcy;&iecy;&scy;&tcy;&ncy;&ycy;&jcy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy; &yacy;&dcy;&rcy;&acy; Linux) &gcy;&ocy;&vcy;&ocy;&rcy;&icy;&tcy; &ocy;&bcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&icy;  git  bisect:</span></p> <div> <blockquote> <p><span data-i18n="bc89b1d491a4170688cc79e9cbd301471af430d05c354a555423b11092d8d212/0b" data-source="I most actively use it during the merge window (when a lot of trees get merged upstream and when the influx of bugs is the highest) - and yes, there have been cases that i used it multiple times a day. My average is roughly once a day." onmousemove="i18n(this)">&YAcy; &ncy;&acy;&icy;&bcy;&ocy;&lcy;&iecy;&iecy; &acy;&kcy;&tcy;&icy;&vcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yucy; &iecy;&gcy;&ocy; &vcy;&ocy; &vcy;&rcy;&iecy;&mcy;&yacy; &ocy;&kcy;&ncy;&acy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; (&kcy;&ocy;&gcy;&dcy;&acy; &mcy;&ncy;&ocy;&gcy;&ocy; &dcy;&iecy;&rcy;&iecy;&vcy;&softcy;&iecy;&vcy; &ocy;&bcy;&hardcy;&iecy;&dcy;&icy;&ncy;&yacy;&iecy;&tcy;&scy;&yacy; &vcy;&vcy;&iecy;&rcy;&khcy; &pcy;&ocy; &tcy;&iecy;&chcy;&iecy;&ncy;&icy;&yucy; &icy; &kcy;&ocy;&gcy;&dcy;&acy; &ncy;&acy;&pcy;&lcy;&ycy;&vcy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy; &scy;&acy;&mcy;&ycy;&jcy; &vcy;&ycy;&scy;&ocy;&kcy;&icy;&jcy;) &mdash; &icy; &dcy;&acy;, &bcy;&ycy;&lcy;&icy; &scy;&lcy;&ucy;&chcy;&acy;&icy;, &chcy;&tcy;&ocy; &yacy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&lcy; &iecy;&gcy;&ocy; &ncy;&iecy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ocy; &rcy;&acy;&zcy; &vcy; &dcy;&iecy;&ncy;&softcy;. &Ucy; &mcy;&iecy;&ncy;&yacy; &vcy; &scy;&rcy;&iecy;&dcy;&ncy;&iecy;&mcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&ncy;&ocy; &rcy;&acy;&zcy; &vcy; &dcy;&iecy;&ncy;&softcy;.</span></p> </blockquote> </div> <p><span data-i18n="10aef385d7310dc12cce10bd05ef57e8a94311078b99d2aca3f7d867d115ee93/74" data-source="So regressions are fought all the time by developers, and indeed it is well known that bugs should be fixed as soon as possible, so as soon as they are found. That&amp;rsquo;s why it is interesting to have good tools for this purpose." onmousemove="i18n(this)">&Tcy;&acy;&kcy; &chcy;&tcy;&ocy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&acy;&mcy;&icy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&icy; &vcy;&scy;&iecy; &vcy;&rcy;&iecy;&mcy;&yacy; &bcy;&ocy;&rcy;&yucy;&tcy;&scy;&yacy;, &dcy;&acy; &icy; &vcy;&ocy;&ocy;&bcy;&shchcy;&iecy; &ocy;&bcy;&shchcy;&iecy;&icy;&zcy;&vcy;&iecy;&scy;&tcy;&ncy;&ocy;, &chcy;&tcy;&ocy; &ocy;&shcy;&icy;&bcy;&kcy;&icy; &ncy;&acy;&dcy;&ocy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&tcy;&softcy; &kcy;&acy;&kcy; &mcy;&ocy;&zhcy;&ncy;&ocy; &scy;&kcy;&ocy;&rcy;&iecy;&iecy;, &tcy;&ocy; &iecy;&scy;&tcy;&softcy; &scy;&rcy;&acy;&zcy;&ucy; &zhcy;&iecy;, &kcy;&acy;&kcy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &ocy;&ncy;&icy; &bcy;&ucy;&dcy;&ucy;&tcy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&iecy;&ncy;&ycy;. &Vcy;&ocy;&tcy; &pcy;&ocy;&chcy;&iecy;&mcy;&ucy; &icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ncy;&ocy; &icy;&mcy;&iecy;&tcy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&iecy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy;&ycy; &dcy;&lcy;&yacy; &ecy;&tcy;&ocy;&jcy; &tscy;&iecy;&lcy;&icy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_other_tools_to_fight_regressions"><span data-i18n="71b833eb26d19ba086f1a7c678a63138264f9ccee597db8413ba96530530414c/12" data-source="Other tools to fight regressions" onmousemove="i18n(this)">&Dcy;&rcy;&ucy;&gcy;&icy;&iecy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy;&ycy; &dcy;&lcy;&yacy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&iecy;&jcy;</span></h3> <p><span data-i18n="8d9b6d7b1c1588042c1395b923dd2369e4a8937274166efe44f6714b2e8fbd24/94" data-source="So what are the tools used to fight regressions? They are nearly the same as those used to fight regular bugs. The only specific tools are test suites and tools similar as &amp;quot;git bisect&amp;quot;." onmousemove="i18n(this)">&Icy;&tcy;&acy;&kcy;, &kcy;&acy;&kcy;&icy;&iecy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy;&ycy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yucy;&tcy;&scy;&yacy; &dcy;&lcy;&yacy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&iecy;&jcy;? &Ocy;&ncy;&icy; &pcy;&ocy;&chcy;&tcy;&icy; &tcy;&acy;&kcy;&icy;&iecy; &zhcy;&iecy;, &kcy;&acy;&kcy; &tcy;&iecy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yucy;&tcy;&scy;&yacy; &dcy;&lcy;&yacy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy; &scy; &ocy;&bcy;&ycy;&chcy;&ncy;&ycy;&mcy;&icy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;&mcy;&icy;. &IEcy;&dcy;&icy;&ncy;&scy;&tcy;&vcy;&iecy;&ncy;&ncy;&ycy;&mcy;&icy; &kcy;&ocy;&ncy;&kcy;&rcy;&iecy;&tcy;&ncy;&ycy;&mcy;&icy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy;&acy;&mcy;&icy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &ncy;&acy;&bcy;&ocy;&rcy;&ycy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &icy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy;&ycy;, &pcy;&ocy;&dcy;&ocy;&bcy;&ncy;&ycy;&iecy;  &quot;git bisect&quot; .</span></p> <p><span data-i18n="23c514b5149d0e39d53adb2aed49803cfcb390acf1c2850391f9e47c9b6cf308/b9" data-source="Test suites are very nice. But when they are used alone, they are supposed to be used so that all the tests are checked after each commit. This means that they are not very efficient, because many tests are run for no interesting result, and they suffer from combinatorial explosion." onmousemove="i18n(this)">&Tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&iecy; &ncy;&acy;&bcy;&ocy;&rcy;&ycy; &ocy;&chcy;&iecy;&ncy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;. &Ncy;&ocy; &kcy;&ocy;&gcy;&dcy;&acy; &ocy;&ncy;&icy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yucy;&tcy;&scy;&yacy; &ocy;&tcy;&dcy;&iecy;&lcy;&softcy;&ncy;&ocy;, &icy;&khcy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&iecy;&tcy;&scy;&yacy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &tcy;&acy;&kcy;, &chcy;&tcy;&ocy;&bcy;&ycy; &vcy;&scy;&iecy; &tcy;&iecy;&scy;&tcy;&ycy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&lcy;&icy;&scy;&softcy; &pcy;&ocy;&scy;&lcy;&iecy; &kcy;&acy;&zhcy;&dcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;. &Ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &ocy;&ncy;&icy; &ncy;&iecy; &ocy;&chcy;&iecy;&ncy;&softcy; &ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&ycy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &mcy;&ncy;&ocy;&gcy;&icy;&iecy; &tcy;&iecy;&scy;&tcy;&ycy; &vcy;&ycy;&pcy;&ocy;&lcy;&ncy;&yacy;&yucy;&tcy;&scy;&yacy; &bcy;&iecy;&zcy; &kcy;&acy;&kcy;&ocy;&gcy;&ocy;-&lcy;&icy;&bcy;&ocy; &icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ncy;&ocy;&gcy;&ocy; &rcy;&iecy;&zcy;&ucy;&lcy;&softcy;&tcy;&acy;&tcy;&acy; &icy; &scy;&tcy;&rcy;&acy;&dcy;&acy;&yucy;&tcy; &ocy;&tcy; &kcy;&ocy;&mcy;&bcy;&icy;&ncy;&acy;&tcy;&ocy;&rcy;&ncy;&ocy;&gcy;&ocy; &vcy;&zcy;&rcy;&ycy;&vcy;&acy;.</span></p> <p><span data-i18n="973add9e5eaa01497c5d79fa5d4d04a5d381f15b196d0248691f997d20c3858b/e7" data-source="In fact the problem is that big software often has many different configuration options and that each test case should pass for each configuration after each commit. So if you have for each release: N configurations, M commits and T test cases, you should perform:" onmousemove="i18n(this)">&Ncy;&acy; &scy;&acy;&mcy;&ocy;&mcy; &dcy;&iecy;&lcy;&iecy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&acy; &vcy; &tcy;&ocy;&mcy;, &chcy;&tcy;&ocy; &bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&iecy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&iecy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&iecy; &chcy;&acy;&scy;&tcy;&ocy; &icy;&mcy;&iecy;&iecy;&tcy; &mcy;&ncy;&ocy;&zhcy;&iecy;&scy;&tcy;&vcy;&ocy; &rcy;&acy;&zcy;&lcy;&icy;&chcy;&ncy;&ycy;&khcy; &vcy;&acy;&rcy;&icy;&acy;&ncy;&tcy;&ocy;&vcy; &kcy;&ocy;&ncy;&fcy;&icy;&gcy;&ucy;&rcy;&acy;&tscy;&icy;&icy; &icy; &chcy;&tcy;&ocy; &kcy;&acy;&zhcy;&dcy;&ycy;&jcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&jcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy; &dcy;&ocy;&lcy;&zhcy;&iecy;&ncy; &pcy;&rcy;&ocy;&khcy;&ocy;&dcy;&icy;&tcy;&softcy; &dcy;&lcy;&yacy; &kcy;&acy;&zhcy;&dcy;&ocy;&jcy; &kcy;&ocy;&ncy;&fcy;&icy;&gcy;&ucy;&rcy;&acy;&tscy;&icy;&icy; &pcy;&ocy;&scy;&lcy;&iecy; &kcy;&acy;&zhcy;&dcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;. &Icy;&tcy;&acy;&kcy;, &iecy;&scy;&lcy;&icy; &dcy;&lcy;&yacy; &kcy;&acy;&zhcy;&dcy;&ocy;&gcy;&ocy; &vcy;&ycy;&pcy;&ucy;&scy;&kcy;&acy; &ucy; &vcy;&acy;&scy; &iecy;&scy;&tcy;&softcy;: N &kcy;&ocy;&ncy;&fcy;&icy;&gcy;&ucy;&rcy;&acy;&tscy;&icy;&jcy;, M &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &icy; T &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&khcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;&vcy;, &vcy;&acy;&mcy; &scy;&lcy;&iecy;&dcy;&ucy;&iecy;&tcy; &vcy;&ycy;&pcy;&ocy;&lcy;&ncy;&icy;&tcy;&softcy;:</span></p> <div> <div> <pre class="hljs language-r">N <span class="hljs-operator">*</span> M <span class="hljs-operator">*</span> <span class="hljs-built_in">T</span> tests</pre> </div> </div> <p><span data-i18n="a963cf9a93a53579dc33155aa7502bc1278890758937d36df02487301bda0399/25" data-source="where N, M and T are all growing with the size your software." onmousemove="i18n(this)">&gcy;&dcy;&iecy; N, M &icy; T &rcy;&acy;&scy;&tcy;&ucy;&tcy; &vcy;&mcy;&iecy;&scy;&tcy;&iecy; &scy; &rcy;&acy;&zcy;&mcy;&iecy;&rcy;&ocy;&mcy; &vcy;&acy;&shcy;&iecy;&gcy;&ocy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;.</span></p> <p><span data-i18n="65d6ee14412a35c2986fb529ca26f039c26d01793de639736521ccd33bd39a07/70" data-source="So very soon it will not be possible to completely test everything." onmousemove="i18n(this)">&Tcy;&acy;&kcy; &chcy;&tcy;&ocy; &scy;&ocy;&vcy;&scy;&iecy;&mcy; &scy;&kcy;&ocy;&rcy;&ocy; &pcy;&ocy;&lcy;&ncy;&ocy;&scy;&tcy;&softcy;&yucy; &vcy;&scy;&iecy; &pcy;&rcy;&ocy;&tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &ncy;&iecy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&tcy;&scy;&yacy;.</span></p> <p><span data-i18n="926b3accbd8b102348c5c4a0315667d054a7a7f9f1ed4956b08929cf67b315c0/f0" data-source="And if some bugs slip through your test suite, then you can add a test to your test suite. But if you want to use your new improved test suite to find where the bug slipped in, then you will either have to emulate a bisection process or you will perhaps bluntly test each commit backward starting from the &amp;quot;bad&amp;quot; commit you have which may be very wasteful." onmousemove="i18n(this)">&Acy; &iecy;&scy;&lcy;&icy; &vcy; &vcy;&acy;&shcy;&iecy;&mcy; &ncy;&acy;&bcy;&ocy;&rcy;&iecy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &pcy;&rcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&zcy;&ncy;&ucy;&tcy; &kcy;&acy;&kcy;&icy;&iecy;-&tcy;&ocy; &ocy;&shcy;&icy;&bcy;&kcy;&icy;, &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &dcy;&ocy;&bcy;&acy;&vcy;&icy;&tcy;&softcy; &tcy;&iecy;&scy;&tcy; &vcy; &scy;&vcy;&ocy;&jcy; &ncy;&acy;&bcy;&ocy;&rcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;. &Ncy;&ocy; &iecy;&scy;&lcy;&icy; &vcy;&ycy; &khcy;&ocy;&tcy;&icy;&tcy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &scy;&vcy;&ocy;&jcy; &ncy;&ocy;&vcy;&ycy;&jcy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&ncy;&ycy;&jcy; &ncy;&acy;&bcy;&ocy;&rcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;, &chcy;&tcy;&ocy;&bcy;&ycy; &ncy;&acy;&jcy;&tcy;&icy; &mcy;&iecy;&scy;&tcy;&ocy;, &gcy;&dcy;&iecy; &pcy;&rcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&zcy;&ncy;&ucy;&lcy;&acy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;, &tcy;&ocy;&gcy;&dcy;&acy; &vcy;&acy;&mcy; &pcy;&rcy;&icy;&dcy;&iecy;&tcy;&scy;&yacy; &lcy;&icy;&bcy;&ocy; &ecy;&mcy;&ucy;&lcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &lcy;&icy;&bcy;&ocy;, &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy;, &vcy;&ycy; &bcy;&ucy;&dcy;&iecy;&tcy;&iecy; &pcy;&rcy;&yacy;&mcy;&ocy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &kcy;&acy;&zhcy;&dcy;&ycy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &vcy; &ocy;&bcy;&rcy;&acy;&tcy;&ncy;&ocy;&mcy; &ncy;&acy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&icy;, &ncy;&acy;&chcy;&icy;&ncy;&acy;&yacy; &scy; &icy;&mcy;&iecy;&yucy;&shchcy;&iecy;&gcy;&ocy;&scy;&yacy; &ucy; &vcy;&acy;&scy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot; , &chcy;&tcy;&ocy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &ocy;&chcy;&iecy;&ncy;&softcy; &rcy;&acy;&scy;&tcy;&ocy;&chcy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy;. .</span></p> </div> </div> <h2 class="text-body-emphasis"  id="_git_bisect_overview"><span data-i18n="18910a635b2f2b47f449f67d518b85239f34d3150afa5488ba92de0970826c28/11" data-source="&amp;quot;git bisect&amp;quot; overview" onmousemove="i18n(this)">&Ocy;&bcy;&zcy;&ocy;&rcy;  &quot;git bisect&quot;</span></h2> <div> <div> <h3 class="text-body-emphasis"  id="_starting_a_bisection"><span data-i18n="70764bbff3ffe74e0830a066e04814e0925eee1293ba3d34b697b9c7c7412c54/8d" data-source="Starting a bisection" onmousemove="i18n(this)">&Ncy;&acy;&chcy;&acy;&lcy;&ocy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;</span></h3> <p><span data-i18n="bf160b37b23142102f92c749c2487e65284f740f8fc412276d7e3fcd8a16ad0f/66" data-source="The first &amp;quot;git bisect&amp;quot; subcommand to use is &amp;quot;git bisect start&amp;quot; to start the search. Then bounds must be set to limit the commit space. This is done usually by giving one &amp;quot;bad&amp;quot; and at least one &amp;quot;good&amp;quot; commit. They can be passed in the initial call to &amp;quot;git bisect start&amp;quot; like this:" onmousemove="i18n(this)">&Pcy;&iecy;&rcy;&vcy;&ocy;&jcy; &pcy;&ocy;&dcy;&kcy;&ocy;&mcy;&acy;&ncy;&dcy;&ocy;&jcy;  &quot;git bisect&quot; , &kcy;&ocy;&tcy;&ocy;&rcy;&ucy;&yucy; &ncy;&ucy;&zhcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;, &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy;  &quot;git bisect start&quot; , &chcy;&tcy;&ocy;&bcy;&ycy; &ncy;&acy;&chcy;&acy;&tcy;&softcy; &pcy;&ocy;&icy;&scy;&kcy;. &Zcy;&acy;&tcy;&iecy;&mcy; &ncy;&iecy;&ocy;&bcy;&khcy;&ocy;&dcy;&icy;&mcy;&ocy; &ucy;&scy;&tcy;&acy;&ncy;&ocy;&vcy;&icy;&tcy;&softcy; &gcy;&rcy;&acy;&ncy;&icy;&tscy;&ycy;, &chcy;&tcy;&ocy;&bcy;&ycy; &ocy;&gcy;&rcy;&acy;&ncy;&icy;&chcy;&icy;&tcy;&softcy; &pcy;&rcy;&ocy;&scy;&tcy;&rcy;&acy;&ncy;&scy;&tcy;&vcy;&ocy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&icy;. &Ocy;&bcy;&ycy;&chcy;&ncy;&ocy; &ecy;&tcy;&ocy; &dcy;&iecy;&lcy;&acy;&iecy;&tcy;&scy;&yacy; &pcy;&ucy;&tcy;&iecy;&mcy; &pcy;&rcy;&iecy;&dcy;&ocy;&scy;&tcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&yacy; &ocy;&dcy;&ncy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot;  &icy; &khcy;&ocy;&tcy;&yacy; &bcy;&ycy; &ocy;&dcy;&ncy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;good&quot; . &Icy;&khcy; &mcy;&ocy;&zhcy;&ncy;&ocy; &pcy;&iecy;&rcy;&iecy;&dcy;&acy;&tcy;&softcy; &pcy;&rcy;&icy; &pcy;&iecy;&rcy;&vcy;&ocy;&ncy;&acy;&chcy;&acy;&lcy;&softcy;&ncy;&ocy;&mcy; &vcy;&ycy;&zcy;&ocy;&vcy;&iecy;  &quot;git bisect start&quot;  &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git bisect start [<span class="hljs-variable constant_">BAD</span> [<span class="hljs-variable constant_">GOOD</span>...]]</pre> </div> </div> <p><span data-i18n="30899e445524dae4e3b36479436fcecb28a7ac63499ca02d9235b0b391af8458/1d" data-source="or they can be set using:" onmousemove="i18n(this)">&icy;&lcy;&icy; &icy;&khcy; &mcy;&ocy;&zhcy;&ncy;&ocy; &ucy;&scy;&tcy;&acy;&ncy;&ocy;&vcy;&icy;&tcy;&softcy; &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy;:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git bisect bad [<span class="hljs-variable constant_">COMMIT</span>]</pre> </div> </div> <p><span data-i18n="42c9595bc4ea5f2baa2ad222e0dddf95e6eeb4f9c2d4a9c62dfe69cc1334d9f4/87" data-source="and:" onmousemove="i18n(this)">and:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git bisect good [<span class="hljs-variable constant_">COMMIT</span>...]</pre> </div> </div> <p><span data-i18n="3008bc0f6115890aa0b22049893ecb50842efd46970a379f1cddd0f06cf0867f/27" data-source="where BAD, GOOD and COMMIT are all names that can be resolved to a commit." onmousemove="i18n(this)">&gcy;&dcy;&iecy; BAD, GOOD &icy; COMMIT &mdash; &ecy;&tcy;&ocy; &icy;&mcy;&iecy;&ncy;&acy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &mcy;&ocy;&zhcy;&ncy;&ocy; &rcy;&acy;&zcy;&rcy;&iecy;&shcy;&icy;&tcy;&softcy; &vcy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yucy;.</span></p> <p><span data-i18n="339f94c710d0f7b699d32286661648ddaef844432ba05bc32367682b219ed319/fc" data-source="Then &amp;quot;git bisect&amp;quot; will checkout a commit of its choosing and ask the user to test it, like this:" onmousemove="i18n(this)">&Zcy;&acy;&tcy;&iecy;&mcy;  &quot;git bisect&quot;  &icy;&zcy;&vcy;&lcy;&iecy;&chcy;&iecy;&tcy; &vcy;&ycy;&bcy;&rcy;&acy;&ncy;&ncy;&ycy;&jcy; &icy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &icy; &pcy;&ocy;&pcy;&rcy;&ocy;&scy;&icy;&tcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yacy; &pcy;&rcy;&ocy;&tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &iecy;&gcy;&ocy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;:</span></p> <div> <div> <pre class="hljs language-sql">$ git bisect <span class="hljs-keyword">start</span> v2<span class="hljs-number">.6</span><span class="hljs-number">.27</span> v2<span class="hljs-number">.6</span><span class="hljs-number">.25</span>
Bisecting: <span class="hljs-number">10928</span> revisions <span class="hljs-keyword">left</span> <span class="hljs-keyword">to</span> test after this (roughly <span class="hljs-number">14</span> steps)
[<span class="hljs-number">2</span>ec65f8b89ea003c27ff7723525a2ee335a2b393] x86: clean up <span class="hljs-keyword">using</span> max_low_pfn <span class="hljs-keyword">on</span> <span class="hljs-number">32</span><span class="hljs-operator">-</span>bit</pre> </div> </div> <p><span data-i18n="a83830fa522e1f12b16d58c980d67a622cdce3e57bc307e0331d2ea0d5f87595/34" data-source="Note that the example that we will use is really a toy example, we will be looking for the first commit that has a version like &amp;quot;2.6.26-something&amp;quot;, that is the commit that has a &amp;quot;SUBLEVEL = 26&amp;quot; line in the top level Makefile. This is a toy example because there are better ways to find this commit with Git than using &amp;quot;git bisect&amp;quot; (for example &amp;quot;git blame&amp;quot; or &amp;quot;git log -S&amp;lt;string&amp;gt;&amp;quot;)." onmousemove="i18n(this)">&Ocy;&bcy;&rcy;&acy;&tcy;&icy;&tcy;&iecy; &vcy;&ncy;&icy;&mcy;&acy;&ncy;&icy;&iecy;, &chcy;&tcy;&ocy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &mcy;&ycy; &bcy;&ucy;&dcy;&iecy;&mcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;, &ncy;&acy; &scy;&acy;&mcy;&ocy;&mcy; &dcy;&iecy;&lcy;&iecy; &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &icy;&gcy;&rcy;&ucy;&shcy;&iecy;&chcy;&ncy;&ycy;&mcy;: &mcy;&ycy; &bcy;&ucy;&dcy;&iecy;&mcy; &icy;&scy;&kcy;&acy;&tcy;&softcy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &scy; &vcy;&iecy;&rcy;&scy;&icy;&iecy;&jcy; &tcy;&icy;&pcy;&acy;  &quot;2.6.26-something&quot; , &tcy;&ocy; &iecy;&scy;&tcy;&softcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &scy;&ocy; &scy;&tcy;&rcy;&ocy;&kcy;&ocy;&jcy;  &quot;SUBLEVEL = 26&quot;  &vcy; Makefile &vcy;&iecy;&rcy;&khcy;&ncy;&iecy;&gcy;&ocy; &ucy;&rcy;&ocy;&vcy;&ncy;&yacy;. &Ecy;&tcy;&ocy; &icy;&gcy;&rcy;&ucy;&shcy;&iecy;&chcy;&ncy;&ycy;&jcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &iecy;&scy;&tcy;&softcy; &lcy;&ucy;&chcy;&shcy;&icy;&iecy; &scy;&pcy;&ocy;&scy;&ocy;&bcy;&ycy; &ncy;&acy;&jcy;&tcy;&icy; &ecy;&tcy;&ocy;&tcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy;  Git , &chcy;&iecy;&mcy; &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy;  &quot;git bisect&quot;  (&ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;,  &quot;git blame&quot;  &icy;&lcy;&icy;  &quot;git log -S&lt;string&gt;&quot; ).</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_driving_a_bisection_manually"><span data-i18n="8397d51467bbf8d89562181b652715c980d31e26e0dc3ae7d6ca168c37c34a5d/0a" data-source="Driving a bisection manually" onmousemove="i18n(this)">&Vcy;&ocy;&zhcy;&dcy;&iecy;&ncy;&icy;&iecy; &bcy;&icy;&scy;&iecy;&kcy;&tscy;&icy;&icy; &vcy;&rcy;&ucy;&chcy;&ncy;&ucy;&yucy;</span></h3> <p><span data-i18n="61c08bf53021c16048ffc853f80075bff1e81a74b51560d2cb9d6c1e8cbbb180/13" data-source="At this point there are basically 2 ways to drive the search. It can be driven manually by the user or it can be driven automatically by a script or a command." onmousemove="i18n(this)">&Ncy;&acy; &dcy;&acy;&ncy;&ncy;&ycy;&jcy; &mcy;&ocy;&mcy;&iecy;&ncy;&tcy; &iecy;&scy;&tcy;&softcy; &dcy;&vcy;&acy; &ocy;&scy;&ncy;&ocy;&vcy;&ncy;&ycy;&khcy; &scy;&pcy;&ocy;&scy;&ocy;&bcy;&acy; &ucy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&icy;&scy;&kcy;&ocy;&mcy;. &Ocy;&ncy; &mcy;&ocy;&zhcy;&iecy;&tcy; &ucy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&tcy;&softcy;&scy;&yacy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&iecy;&mcy; &vcy;&rcy;&ucy;&chcy;&ncy;&ucy;&yucy; &icy;&lcy;&icy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&yacy; &icy;&lcy;&icy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;&ycy;.</span></p> <p><span data-i18n="120710833bdf0ee2d77a32e3388b7e36efca5cc9860b62fe2fb107bb23f803dc/7c" data-source="If the user is driving it, then at each step of the search, the user will have to test the current commit and say if it is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot; using the &amp;quot;git bisect good&amp;quot; or &amp;quot;git bisect bad&amp;quot; commands respectively that have been described above. For example:" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &icy;&mcy; &ucy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&iecy;&tcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&softcy;, &tcy;&ocy; &ncy;&acy; &kcy;&acy;&zhcy;&dcy;&ocy;&mcy; &shcy;&acy;&gcy;&iecy; &pcy;&ocy;&icy;&scy;&kcy;&acy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yucy; &pcy;&rcy;&icy;&dcy;&iecy;&tcy;&scy;&yacy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&tcy;&softcy; &tcy;&iecy;&kcy;&ucy;&shchcy;&icy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &icy; &gcy;&ocy;&vcy;&ocy;&rcy;&icy;&tcy;&softcy;,  &quot;good&quot;  &ecy;&tcy;&ocy; &icy;&lcy;&icy;  &quot;bad&quot; , &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;  &quot;git bisect good&quot;  &icy;&lcy;&icy;  &quot;git bisect bad&quot;  &scy;&ocy;&ocy;&tcy;&vcy;&iecy;&tcy;&scy;&tcy;&vcy;&iecy;&ncy;&ncy;&ocy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &bcy;&ycy;&lcy;&icy; &ocy;&pcy;&icy;&scy;&acy;&ncy;&ycy; &vcy;&ycy;&shcy;&iecy;. &Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;:</span></p> <div> <div> <pre class="hljs language-yaml"><span class="hljs-string">$</span> <span class="hljs-string">git</span> <span class="hljs-string">bisect</span> <span class="hljs-string">bad</span>
<span class="hljs-attr">Bisecting:</span> <span class="hljs-number">5480 </span><span class="hljs-string">revisions</span> <span class="hljs-string">left</span> <span class="hljs-string">to</span> <span class="hljs-string">test</span> <span class="hljs-string">after</span> <span class="hljs-string">this</span> <span class="hljs-string">(roughly</span> <span class="hljs-number">13</span> <span class="hljs-string">steps)</span>
[<span class="hljs-string">66c0b394f08fd89236515c1c84485ea712a157be</span>] <span class="hljs-attr">KVM:</span> <span class="hljs-string">kill</span> <span class="hljs-string">file-&gt;f_count</span> <span class="hljs-string">abuse</span> <span class="hljs-string">in</span> <span class="hljs-string">kvm</span></pre> </div> </div> <p><span data-i18n="644f6d9083552376e697602dcbe45c3b8dfaadd50932367290da50fc99d11e17/e8" data-source="And after a few more steps like that, &amp;quot;git bisect&amp;quot; will eventually find a first bad commit:" onmousemove="i18n(this)">&Icy; &pcy;&ocy;&scy;&lcy;&iecy; &iecy;&shchcy;&iecy; &ncy;&iecy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&icy;&khcy; &pcy;&ocy;&dcy;&ocy;&bcy;&ncy;&ycy;&khcy; &shcy;&acy;&gcy;&ocy;&vcy;  &quot;git bisect&quot;  &vcy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;&mcy; &icy;&tcy;&ocy;&gcy;&iecy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&icy;&tcy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;:</span></p> <div> <div> <pre class="hljs language-sql">$ git bisect bad
<span class="hljs-number">2</span>ddcca36c8bcfa251724fe342c8327451988be0d <span class="hljs-keyword">is</span> the <span class="hljs-keyword">first</span> bad <span class="hljs-keyword">commit</span>
<span class="hljs-keyword">commit</span> <span class="hljs-number">2</span>ddcca36c8bcfa251724fe342c8327451988be0d
Author: Linus Torvalds <span class="hljs-operator">&lt;</span>torvalds<span class="hljs-variable">@linux</span><span class="hljs-operator">-</span>foundation.org<span class="hljs-operator">&gt;</span>
<span class="hljs-type">Date</span>:   Sat May <span class="hljs-number">3</span> <span class="hljs-number">11</span>:<span class="hljs-number">59</span>:<span class="hljs-number">44</span> <span class="hljs-number">2008</span> <span class="hljs-number">-0700</span>

    Linux <span class="hljs-number">2.6</span><span class="hljs-number">.26</span><span class="hljs-operator">-</span>rc1

:<span class="hljs-number">100644</span> <span class="hljs-number">100644</span> <span class="hljs-number">5</span>cf82581... <span class="hljs-number">4492984</span>e... M      Makefile</pre> </div> </div> <p><span data-i18n="3b73f8e5a100839cfc73b3b373183acc117627400a536779ea0823b3299a9cbf/4f" data-source="At this point we can see what the commit does, check it out (if it&amp;rsquo;s not already checked out) or tinker with it, for example:" onmousemove="i18n(this)">&Ncy;&acy; &ecy;&tcy;&ocy;&mcy; &ecy;&tcy;&acy;&pcy;&iecy; &mcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&mcy; &ucy;&vcy;&icy;&dcy;&iecy;&tcy;&softcy;, &chcy;&tcy;&ocy; &dcy;&iecy;&lcy;&acy;&iecy;&tcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&icy;&tcy;&softcy; &iecy;&gcy;&ocy; (&iecy;&scy;&lcy;&icy; &ocy;&ncy; &iecy;&shchcy;&iecy; &ncy;&iecy; &icy;&zcy;&vcy;&lcy;&iecy;&chcy;&iecy;&ncy;) &icy;&lcy;&icy; &pcy;&ocy;&rcy;&acy;&bcy;&ocy;&tcy;&acy;&tcy;&softcy; &scy; &ncy;&icy;&mcy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;:</span></p> <div> <div> <pre class="hljs language-diff">$ git show HEAD
commit 2ddcca36c8bcfa251724fe342c8327451988be0d
Author: Linus Torvalds &lt;<a href="https://runebook.dev/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b5c1dac7c3d4d9d1c6f5d9dcdbc0cd98d3dac0dbd1d4c1dcdadb9bdac7d2">[email&#160;protected]</a>&gt;
Date:   Sat May 3 11:59:44 2008 -0700

    Linux 2.6.26-rc1

<span class="hljs-comment">diff --git a/Makefile b/Makefile</span>
<span class="hljs-comment" title="index 5cf8258..4492984 100644">&icy;&ncy;&dcy;&iecy;&kcy;&scy; 5cf8258..4492984 100644</span>
<span class="hljs-comment">--- a/Makefile</span>
<span class="hljs-comment">+++ b/Makefile</span>
<span class="hljs-meta">@@ -1,7 +1,7 @@</span>
 VERSION = 2
 PATCHLEVEL = 6
<span class="hljs-deletion">-SUBLEVEL = 25</span>
<span class="hljs-deletion">-EXTRAVERSION =</span>
<span class="hljs-addition">+SUBLEVEL = 26</span>
<span class="hljs-addition">+EXTRAVERSION = -rc1</span>
 NAME = Funky Weasel is Jiggy wit it

 # *DOCUMENTATION*</pre> </div> </div> <p><span data-i18n="f60b08de9fa905440c0ab9f13877f9eab713d281348e08658fcd08d318bf210d/30" data-source="And when we are finished we can use &amp;quot;git bisect reset&amp;quot; to go back to the branch we were in before we started bisecting:" onmousemove="i18n(this)">&Icy; &kcy;&ocy;&gcy;&dcy;&acy; &mcy;&ycy; &zcy;&acy;&kcy;&ocy;&ncy;&chcy;&icy;&mcy;, &mcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&mcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;  &quot;git bisect reset&quot; , &chcy;&tcy;&ocy;&bcy;&ycy; &vcy;&iecy;&rcy;&ncy;&ucy;&tcy;&softcy;&scy;&yacy; &kcy; &tcy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&iecy;, &vcy; &kcy;&ocy;&tcy;&ocy;&rcy;&ocy;&jcy; &mcy;&ycy; &ncy;&acy;&khcy;&ocy;&dcy;&icy;&lcy;&icy;&scy;&softcy; &dcy;&ocy; &tcy;&ocy;&gcy;&ocy;, &kcy;&acy;&kcy; &ncy;&acy;&chcy;&acy;&lcy;&icy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;:</span></p> <div> <div> <pre class="hljs language-bash">$ git bisect reset
Checking out files: 100% (21549/21549), <span class="hljs-keyword">done</span>.
Previous HEAD position was 2ddcca3... Linux 2.6.26-rc1
Switched to branch <span class="hljs-string">&apos;master&apos;</span></pre> </div> </div> </div> <div> <h3 class="text-body-emphasis"  id="_driving_a_bisection_automatically"><span data-i18n="3da7ffa244a1b4f0c39da9d68c0028cff3659e9569c892a43d09c2fb18e95de5/57" data-source="Driving a bisection automatically" onmousemove="i18n(this)">&Acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&ocy;&iecy; &vcy;&ocy;&zhcy;&dcy;&iecy;&ncy;&icy;&iecy; &bcy;&icy;&scy;&iecy;&kcy;&tscy;&icy;&icy;</span></h3> <p><span data-i18n="8adef84b94359ee71ad0af64f549f7b01a84bc52b549ed1ebd750d80dee7964f/86" data-source="The other way to drive the bisection process is to tell &amp;quot;git bisect&amp;quot; to launch a script or command at each bisection step to know if the current commit is &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;. To do that, we use the &amp;quot;git bisect run&amp;quot; command. For example:" onmousemove="i18n(this)">&Dcy;&rcy;&ucy;&gcy;&ocy;&jcy; &scy;&pcy;&ocy;&scy;&ocy;&bcy; &ucy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&tcy;&softcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;&ocy;&mcy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &mdash; &ucy;&kcy;&acy;&zcy;&acy;&tcy;&softcy;  &quot;git bisect&quot;  &zcy;&acy;&pcy;&ucy;&scy;&kcy;&acy;&tcy;&softcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy; &icy;&lcy;&icy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;&ucy; &ncy;&acy; &kcy;&acy;&zhcy;&dcy;&ocy;&mcy; &ecy;&tcy;&acy;&pcy;&iecy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &chcy;&tcy;&ocy;&bcy;&ycy; &ucy;&zcy;&ncy;&acy;&tcy;&softcy;, &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &lcy;&icy; &tcy;&iecy;&kcy;&ucy;&shchcy;&acy;&yacy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yacy;  &quot;good&quot;  &icy;&lcy;&icy;  &quot;bad&quot; . &Dcy;&lcy;&yacy; &ecy;&tcy;&ocy;&gcy;&ocy; &mcy;&ycy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&mcy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;&ucy;  &quot;git bisect run&quot; . &Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;:</span></p> <div> <div> <pre class="hljs language-sql">$ git bisect <span class="hljs-keyword">start</span> v2<span class="hljs-number">.6</span><span class="hljs-number">.27</span> v2<span class="hljs-number">.6</span><span class="hljs-number">.25</span>
Bisecting: <span class="hljs-number">10928</span> revisions <span class="hljs-keyword">left</span> <span class="hljs-keyword">to</span> test after this (roughly <span class="hljs-number">14</span> steps)
[<span class="hljs-number">2</span>ec65f8b89ea003c27ff7723525a2ee335a2b393] x86: clean up <span class="hljs-keyword">using</span> max_low_pfn <span class="hljs-keyword">on</span> <span class="hljs-number">32</span><span class="hljs-operator">-</span>bit
$
$ git bisect run grep <span class="hljs-string">&apos;^SUBLEVEL = 25&apos;</span> Makefile
<span class="hljs-keyword">running</span> grep <span class="hljs-operator">^</span>SUBLEVEL <span class="hljs-operator">=</span> <span class="hljs-number">25</span> Makefile
Bisecting: <span class="hljs-number">5480</span> revisions <span class="hljs-keyword">left</span> <span class="hljs-keyword">to</span> test after this (roughly <span class="hljs-number">13</span> steps)
[<span class="hljs-number">66</span>c0b394f08fd89236515c1c84485ea712a157be] KVM: kill file<span class="hljs-operator">-</span><span class="hljs-operator">&gt;</span>f_count abuse <span class="hljs-keyword">in</span> kvm
<span class="hljs-keyword">running</span> grep <span class="hljs-operator">^</span>SUBLEVEL <span class="hljs-operator">=</span> <span class="hljs-number">25</span> Makefile
SUBLEVEL <span class="hljs-operator">=</span> <span class="hljs-number">25</span>
Bisecting: <span class="hljs-number">2740</span> revisions <span class="hljs-keyword">left</span> <span class="hljs-keyword">to</span> test after this (roughly <span class="hljs-number">12</span> steps)
[<span class="hljs-number">671294719628</span>f1671faefd4882764886f8ad08cb] V4L<span class="hljs-operator">/</span>DVB(<span class="hljs-number">7879</span>): Adding cx18 Support <span class="hljs-keyword">for</span> mxl5005s
...
...
<span class="hljs-keyword">running</span> grep <span class="hljs-operator">^</span>SUBLEVEL <span class="hljs-operator">=</span> <span class="hljs-number">25</span> Makefile
Bisecting: <span class="hljs-number">0</span> revisions <span class="hljs-keyword">left</span> <span class="hljs-keyword">to</span> test after this (roughly <span class="hljs-number">0</span> steps)
[<span class="hljs-number">2</span>ddcca36c8bcfa251724fe342c8327451988be0d] Linux <span class="hljs-number">2.6</span><span class="hljs-number">.26</span><span class="hljs-operator">-</span>rc1
<span class="hljs-keyword">running</span> grep <span class="hljs-operator">^</span>SUBLEVEL <span class="hljs-operator">=</span> <span class="hljs-number">25</span> Makefile
<span class="hljs-number">2</span>ddcca36c8bcfa251724fe342c8327451988be0d <span class="hljs-keyword">is</span> the <span class="hljs-keyword">first</span> bad <span class="hljs-keyword">commit</span>
<span class="hljs-keyword">commit</span> <span class="hljs-number">2</span>ddcca36c8bcfa251724fe342c8327451988be0d
Author: Linus Torvalds <span class="hljs-operator">&lt;</span>torvalds<span class="hljs-variable">@linux</span><span class="hljs-operator">-</span>foundation.org<span class="hljs-operator">&gt;</span>
<span class="hljs-type">Date</span>:   Sat May <span class="hljs-number">3</span> <span class="hljs-number">11</span>:<span class="hljs-number">59</span>:<span class="hljs-number">44</span> <span class="hljs-number">2008</span> <span class="hljs-number">-0700</span>

    Linux <span class="hljs-number">2.6</span><span class="hljs-number">.26</span><span class="hljs-operator">-</span>rc1

:<span class="hljs-number">100644</span> <span class="hljs-number">100644</span> <span class="hljs-number">5</span>cf82581... <span class="hljs-number">4492984</span>e... M      Makefile
bisect run success</pre> </div> </div> <p><span data-i18n="4b3464fb58bd40b5c3cb92617ab0c1b379c63a87e3e3b41b6e05902222103b9a/6a" data-source="In this example, we passed &amp;quot;grep &lt;code&gt;^SUBLEVEL = 25&lt;/code&gt; Makefile&amp;quot; as parameter to &amp;quot;git bisect run&amp;quot;. This means that at each step, the grep command we passed will be launched. And if it exits with code 0 (that means success) then git bisect will mark the current state as &amp;quot;good&amp;quot;. If it exits with code 1 (or any code between 1 and 127 included, except the special code 125), then the current state will be marked as &amp;quot;bad&amp;quot;." onmousemove="i18n(this)">&Vcy; &ecy;&tcy;&ocy;&mcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&iecy; &mcy;&ycy; &pcy;&iecy;&rcy;&iecy;&dcy;&acy;&lcy;&icy;  &quot;grep   <code>^SUBLEVEL = 25</code>   Makefile&quot;  &vcy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&iecy; &pcy;&acy;&rcy;&acy;&mcy;&iecy;&tcy;&rcy;&acy;  &quot;git bisect run&quot; . &Ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &ncy;&acy; &kcy;&acy;&zhcy;&dcy;&ocy;&mcy; &shcy;&acy;&gcy;&iecy; &bcy;&ucy;&dcy;&iecy;&tcy; &zcy;&acy;&pcy;&ucy;&scy;&kcy;&acy;&tcy;&softcy;&scy;&yacy; &pcy;&iecy;&rcy;&iecy;&dcy;&acy;&ncy;&ncy;&acy;&yacy; &ncy;&acy;&mcy;&icy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;&acy; grep. &Icy; &iecy;&scy;&lcy;&icy; &ocy;&ncy; &vcy;&ycy;&jcy;&dcy;&iecy;&tcy; &scy; &kcy;&ocy;&dcy;&ocy;&mcy; 0 (&chcy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy; &ucy;&scy;&pcy;&iecy;&khcy;), &tcy;&ocy;  git  &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &ocy;&tcy;&mcy;&iecy;&tcy;&icy;&tcy; &tcy;&iecy;&kcy;&ucy;&shchcy;&iecy;&iecy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&iecy; &kcy;&acy;&kcy;  &quot;good&quot; . &IEcy;&scy;&lcy;&icy; &ocy;&ncy; &zcy;&acy;&vcy;&iecy;&rcy;&shcy;&acy;&iecy;&tcy;&scy;&yacy; &scy; &kcy;&ocy;&dcy;&ocy;&mcy; 1 (&icy;&lcy;&icy; &lcy;&yucy;&bcy;&ycy;&mcy; &vcy;&kcy;&lcy;&yucy;&chcy;&iecy;&ncy;&ncy;&ycy;&mcy; &kcy;&ocy;&dcy;&ocy;&mcy; &ocy;&tcy; 1 &dcy;&ocy; 127, &kcy;&rcy;&ocy;&mcy;&iecy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ocy;&gcy;&ocy; &kcy;&ocy;&dcy;&acy; 125), &tcy;&ocy; &tcy;&iecy;&kcy;&ucy;&shchcy;&iecy;&iecy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&iecy; &bcy;&ucy;&dcy;&iecy;&tcy; &ocy;&tcy;&mcy;&iecy;&chcy;&iecy;&ncy;&ocy; &kcy;&acy;&kcy;  &quot;bad&quot; .</span></p> <p><span data-i18n="f4694ca44d74c8b2d931e982956f75e675b2f1770959108dd401593bb6923c8a/0e" data-source="Exit code between 128 and 255 are special to &amp;quot;git bisect run&amp;quot;. They make it stop immediately the bisection process. This is useful for example if the command passed takes too long to complete, because you can kill it with a signal and it will stop the bisection process." onmousemove="i18n(this)">&Kcy;&ocy;&dcy;&ycy; &vcy;&ycy;&khcy;&ocy;&dcy;&acy; &mcy;&iecy;&zhcy;&dcy;&ucy; 128 &icy; 255 &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&mcy;&icy; &dcy;&lcy;&yacy;  &quot;git bisect run&quot; . &Ocy;&ncy;&icy; &zcy;&acy;&scy;&tcy;&acy;&vcy;&lcy;&yacy;&yucy;&tcy; &iecy;&gcy;&ocy; &ncy;&iecy;&mcy;&iecy;&dcy;&lcy;&iecy;&ncy;&ncy;&ocy; &ocy;&scy;&tcy;&acy;&ncy;&ocy;&vcy;&icy;&tcy;&softcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;. &Ecy;&tcy;&ocy; &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ocy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &iecy;&scy;&lcy;&icy; &pcy;&iecy;&rcy;&iecy;&dcy;&acy;&ncy;&ncy;&acy;&yacy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;&acy; &vcy;&ycy;&pcy;&ocy;&lcy;&ncy;&yacy;&iecy;&tcy;&scy;&yacy; &scy;&lcy;&icy;&shcy;&kcy;&ocy;&mcy; &dcy;&ocy;&lcy;&gcy;&ocy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &ucy;&ncy;&icy;&chcy;&tcy;&ocy;&zhcy;&icy;&tcy;&softcy; &iecy;&iecy; &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy; &scy;&icy;&gcy;&ncy;&acy;&lcy;&acy;, &icy; &ecy;&tcy;&ocy; &ocy;&scy;&tcy;&acy;&ncy;&ocy;&vcy;&icy;&tcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;.</span></p> <p><span data-i18n="5d21fc8dc0231abc40c3728ebcfbf116293b3f2849165acbeb5580f5885ee078/37" data-source="It can also be useful in scripts passed to &amp;quot;git bisect run&amp;quot; to &amp;quot;exit 255&amp;quot; if some very abnormal situation is detected." onmousemove="i18n(this)">&Ecy;&tcy;&ocy; &tcy;&acy;&kcy;&zhcy;&iecy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ocy; &vcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&yacy;&khcy;, &pcy;&iecy;&rcy;&iecy;&dcy;&acy;&vcy;&acy;&iecy;&mcy;&ycy;&khcy; &ocy;&tcy;  &quot;git bisect run&quot;  &dcy;&ocy;  &quot;exit 255&quot; , &iecy;&scy;&lcy;&icy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&iecy;&ncy;&acy; &kcy;&acy;&kcy;&acy;&yacy;-&tcy;&ocy; &ocy;&chcy;&iecy;&ncy;&softcy; &ncy;&iecy;&ncy;&ocy;&rcy;&mcy;&acy;&lcy;&softcy;&ncy;&acy;&yacy; &scy;&icy;&tcy;&ucy;&acy;&tscy;&icy;&yacy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_avoiding_untestable_commits"><span data-i18n="477d95920bb4d82b0c24a7cd4edd76487596a92f08cb9db79cf858cf11217fe4/19" data-source="Avoiding untestable commits" onmousemove="i18n(this)">&Kcy;&acy;&kcy; &icy;&zcy;&bcy;&iecy;&zhcy;&acy;&tcy;&softcy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;</span></h3> <p><span data-i18n="752989946355c5e753162d5ca933f2837a9ac4e7bcb3d2415c3b9823f7043f41/d4" data-source="Sometimes it happens that the current state cannot be tested, for example if it does not compile because there was a bug preventing it at that time. This is what the special exit code 125 is for. It tells &amp;quot;git bisect run&amp;quot; that the current commit should be marked as untestable and that another one should be chosen and checked out." onmousemove="i18n(this)">&Icy;&ncy;&ocy;&gcy;&dcy;&acy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;&tcy;&scy;&yacy;, &chcy;&tcy;&ocy; &tcy;&iecy;&kcy;&ucy;&shchcy;&iecy;&iecy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&iecy; &ncy;&iecy;&vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&icy;&tcy;&softcy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &iecy;&scy;&lcy;&icy; &ocy;&ncy;&ocy; &ncy;&iecy; &kcy;&ocy;&mcy;&pcy;&icy;&lcy;&icy;&rcy;&ucy;&iecy;&tcy;&scy;&yacy; &icy;&zcy;-&zcy;&acy; &ocy;&shcy;&icy;&bcy;&kcy;&icy;, &pcy;&rcy;&iecy;&pcy;&yacy;&tcy;&scy;&tcy;&vcy;&ucy;&yucy;&shchcy;&iecy;&jcy; &ecy;&tcy;&ocy;&mcy;&ucy; &vcy; &tcy;&ocy;&tcy; &mcy;&ocy;&mcy;&iecy;&ncy;&tcy;. &Dcy;&lcy;&yacy; &ecy;&tcy;&ocy;&gcy;&ocy; &ncy;&ucy;&zhcy;&iecy;&ncy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&jcy; &kcy;&ocy;&dcy; &vcy;&ycy;&khcy;&ocy;&dcy;&acy; 125. &Ocy;&ncy; &scy;&ocy;&ocy;&bcy;&shchcy;&acy;&iecy;&tcy;  &quot;git bisect run&quot; , &chcy;&tcy;&ocy; &tcy;&iecy;&kcy;&ucy;&shchcy;&icy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &dcy;&ocy;&lcy;&zhcy;&iecy;&ncy; &bcy;&ycy;&tcy;&softcy; &pcy;&ocy;&mcy;&iecy;&chcy;&iecy;&ncy; &kcy;&acy;&kcy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&jcy; &icy; &chcy;&tcy;&ocy; &scy;&lcy;&iecy;&dcy;&ucy;&iecy;&tcy; &vcy;&ycy;&bcy;&rcy;&acy;&tcy;&softcy; &icy; &icy;&zcy;&vcy;&lcy;&iecy;&chcy;&softcy; &dcy;&rcy;&ucy;&gcy;&ocy;&jcy;.</span></p> <p><span data-i18n="16b05ca04246705a04457c8aec1db1d464626806e788813be83683b991a6ca7f/3b" data-source="If the bisection process is driven manually, you can use &amp;quot;git bisect skip&amp;quot; to do the same thing. (In fact the special exit code 125 makes &amp;quot;git bisect run&amp;quot; use &amp;quot;git bisect skip&amp;quot; in the background.)" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &ucy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &vcy;&rcy;&ucy;&chcy;&ncy;&ucy;&yucy;, &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;  &quot;git bisect skip&quot; , &chcy;&tcy;&ocy;&bcy;&ycy; &scy;&dcy;&iecy;&lcy;&acy;&tcy;&softcy; &tcy;&ocy; &zhcy;&iecy; &scy;&acy;&mcy;&ocy;&iecy;. (&Fcy;&acy;&kcy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&jcy; &kcy;&ocy;&dcy; &vcy;&ycy;&khcy;&ocy;&dcy;&acy; 125 &zcy;&acy;&scy;&tcy;&acy;&vcy;&lcy;&yacy;&iecy;&tcy;  &quot;git bisect run&quot;  &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;  &quot;git bisect skip&quot;  &vcy; &fcy;&ocy;&ncy;&ocy;&vcy;&ocy;&mcy; &rcy;&iecy;&zhcy;&icy;&mcy;&iecy;.)</span></p> <p><span data-i18n="afe4392f8acba11541d09cc22fa8a755e1bf209ef2484d284ba21de366f6238f/c4" data-source="Or if you want more control, you can inspect the current state using for example &amp;quot;git bisect visualize&amp;quot;. It will launch gitk (or &amp;quot;git log&amp;quot; if the &lt;code&gt;DISPLAY&lt;/code&gt; environment variable is not set) to help you find a better bisection point." onmousemove="i18n(this)">&Icy;&lcy;&icy;, &iecy;&scy;&lcy;&icy; &vcy;&acy;&mcy; &ncy;&ucy;&zhcy;&iecy;&ncy; &bcy;&ocy;&lcy;&softcy;&shcy;&icy;&jcy; &kcy;&ocy;&ncy;&tcy;&rcy;&ocy;&lcy;&softcy;, &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&icy;&tcy;&softcy; &tcy;&iecy;&kcy;&ucy;&shchcy;&iecy;&iecy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&iecy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy;  &quot;git bisect visualize&quot; . &Ocy;&ncy; &zcy;&acy;&pcy;&ucy;&scy;&tcy;&icy;&tcy; gitk (&icy;&lcy;&icy;  &quot;git log&quot; , &iecy;&scy;&lcy;&icy; &pcy;&iecy;&rcy;&iecy;&mcy;&iecy;&ncy;&ncy;&acy;&yacy; &scy;&rcy;&iecy;&dcy;&ycy;  <code>DISPLAY</code>  &ncy;&iecy; &ucy;&scy;&tcy;&acy;&ncy;&ocy;&vcy;&lcy;&iecy;&ncy;&acy;), &chcy;&tcy;&ocy;&bcy;&ycy; &pcy;&ocy;&mcy;&ocy;&chcy;&softcy; &vcy;&acy;&mcy; &ncy;&acy;&jcy;&tcy;&icy; &lcy;&ucy;&chcy;&shcy;&ucy;&yucy; &tcy;&ocy;&chcy;&kcy;&ucy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy;.</span></p> <p><span data-i18n="8198812af03b313dfcc387c592bbe65a95cf8f82098714b422552f4ae0656d55/60" data-source="Either way, if you have a string of untestable commits, it might happen that the regression you are looking for has been introduced by one of these untestable commits. In this case it&amp;rsquo;s not possible to tell for sure which commit introduced the regression." onmousemove="i18n(this)">&Vcy; &lcy;&yucy;&bcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;, &iecy;&scy;&lcy;&icy; &ucy; &vcy;&acy;&scy; &iecy;&scy;&tcy;&softcy; &rcy;&yacy;&dcy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;, &mcy;&ocy;&zhcy;&iecy;&tcy; &scy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy;&scy;&yacy; &tcy;&acy;&kcy;, &chcy;&tcy;&ocy; &icy;&scy;&kcy;&ocy;&mcy;&acy;&yacy; &vcy;&acy;&mcy;&icy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yacy; &bcy;&ycy;&lcy;&acy; &vcy;&vcy;&iecy;&dcy;&iecy;&ncy;&acy; &ocy;&dcy;&ncy;&icy;&mcy; &icy;&zcy; &ecy;&tcy;&icy;&khcy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;. &Vcy; &ecy;&tcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy; &ncy;&iecy;&vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy; &tcy;&ocy;&chcy;&ncy;&ocy; &scy;&kcy;&acy;&zcy;&acy;&tcy;&softcy;, &kcy;&acy;&kcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &vcy;&ycy;&zcy;&vcy;&acy;&lcy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yucy;.</span></p> <p><span data-i18n="c1649ffd9668f8d07e814f35e03fe350602706b254f51933efef5a7db8207466/e6" data-source="So if you used &amp;quot;git bisect skip&amp;quot; (or the run script exited with special code 125) you could get a result like this:" onmousemove="i18n(this)">&Icy;&tcy;&acy;&kcy;, &iecy;&scy;&lcy;&icy; &vcy;&ycy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&lcy;&icy;  &quot;git bisect skip&quot;  (&icy;&lcy;&icy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy; &zcy;&acy;&pcy;&ucy;&scy;&kcy;&acy; &zcy;&acy;&vcy;&iecy;&rcy;&shcy;&icy;&lcy;&scy;&yacy; &scy;&ocy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&mcy; &kcy;&ocy;&dcy;&ocy;&mcy; 125), &vcy;&ycy; &mcy;&ocy;&gcy;&lcy;&icy; &bcy;&ycy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy; &tcy;&acy;&kcy;&ocy;&jcy; &rcy;&iecy;&zcy;&ucy;&lcy;&softcy;&tcy;&acy;&tcy;:</span></p> <div> <div> <pre class="hljs language-sql">There <span class="hljs-keyword">are</span> <span class="hljs-keyword">only</span> <span class="hljs-string">&apos;skip&apos;</span>ped commits <span class="hljs-keyword">left</span> <span class="hljs-keyword">to</span> test.
The <span class="hljs-keyword">first</span> bad <span class="hljs-keyword">commit</span> could be <span class="hljs-keyword">any</span> <span class="hljs-keyword">of</span>:
<span class="hljs-number">15722</span>f2fa328eaba97022898a305ffc8172db6b1
<span class="hljs-number">78e86</span>cf3e850bd755bb71831f42e200626fbd1e0
e15b73ad3db9b48d7d1ade32f8cd23a751fe0ace
<span class="hljs-number">070</span>eab2303024706f2924822bfec8b9847e4ac1b
We cannot bisect more<span class="hljs-operator">!</span></pre> </div> </div> </div> <div> <h3 class="text-body-emphasis"  id="_saving_a_log_and_replaying_it"><span data-i18n="2caca7010a13849c18dfef1012fbe558cbaa04226c2bf1d18fc8d3a15e7ea5f0/08" data-source="Saving a log and replaying it" onmousemove="i18n(this)">&Scy;&ocy;&khcy;&rcy;&acy;&ncy;&iecy;&ncy;&icy;&iecy; &zhcy;&ucy;&rcy;&ncy;&acy;&lcy;&acy; &icy; &iecy;&gcy;&ocy; &vcy;&ocy;&scy;&pcy;&rcy;&ocy;&icy;&zcy;&vcy;&iecy;&dcy;&iecy;&ncy;&icy;&iecy;</span></h3> <p><span data-i18n="662fa2175b375ee4db73e9441bd80a65bfec62400166a0a6f81a2b0c9420fcc9/2a" data-source="If you want to show other people your bisection process, you can get a log using for example:" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &vcy;&ycy; &khcy;&ocy;&tcy;&icy;&tcy;&iecy; &pcy;&ocy;&kcy;&acy;&zcy;&acy;&tcy;&softcy; &dcy;&rcy;&ucy;&gcy;&icy;&mcy; &lcy;&yucy;&dcy;&yacy;&mcy; &scy;&vcy;&ocy;&jcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy; &zhcy;&ucy;&rcy;&ncy;&acy;&lcy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;:</span></p> <div> <div> <pre class="hljs language-shell"><span class="hljs-meta prompt_">$ </span><span class="language-bash">git bisect <span class="hljs-built_in">log</span> &gt; bisect_log.txt</span></pre> </div> </div> <p><span data-i18n="d61a7794c9f39247fa7a8921d7489e88dae9dbf4c699b66d3b61679ffb26848f/69" data-source="And it is possible to replay it using:" onmousemove="i18n(this)">&Icy; &iecy;&gcy;&ocy; &mcy;&ocy;&zhcy;&ncy;&ocy; &vcy;&ocy;&scy;&pcy;&rcy;&ocy;&icy;&zcy;&vcy;&iecy;&scy;&tcy;&icy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yacy;:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git bisect replay bisect_log.txt</pre> </div> </div> </div> </div> <h2 class="text-body-emphasis"  id="_git_bisect_details"><span data-i18n="25e9fc2863664f5399337490ac569a6013390d04307de5245662831f1cc7a5d6/37" data-source="&amp;quot;git bisect&amp;quot; details" onmousemove="i18n(this)">&Dcy;&iecy;&tcy;&acy;&lcy;&icy;  &quot;git bisect&quot;</span></h2> <div> <div> <h3 class="text-body-emphasis"  id="_bisection_algorithm"><span data-i18n="83642d03f060358edd65b1ce4986e84be84ad54ec7a421e2ad642ca35ce4e745/65" data-source="Bisection algorithm" onmousemove="i18n(this)">Bisection algorithm</span></h3> <p><span data-i18n="f26718bc3fb83e7112222969171d4f4414f7fa44fc302cd18da8d0b9b2020e9a/e2" data-source="As the Git commits form a directed acyclic graph (DAG), finding the best bisection commit to test at each step is not so simple. Anyway Linus found and implemented a &amp;quot;truly stupid&amp;quot; algorithm, later improved by Junio Hamano, that works quite well." onmousemove="i18n(this)">&Pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;  Git  &ocy;&bcy;&rcy;&acy;&zcy;&ucy;&yucy;&tcy; &ocy;&rcy;&icy;&iecy;&ncy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&ncy;&ycy;&jcy; &acy;&tscy;&icy;&kcy;&lcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;&jcy; &gcy;&rcy;&acy;&fcy; (DAG), &ncy;&acy;&jcy;&tcy;&icy; &lcy;&ucy;&chcy;&shcy;&icy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &dcy;&lcy;&yacy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; &ncy;&acy; &kcy;&acy;&zhcy;&dcy;&ocy;&mcy; &ecy;&tcy;&acy;&pcy;&iecy; &ncy;&iecy; &tcy;&acy;&kcy; &pcy;&rcy;&ocy;&scy;&tcy;&ocy;. &Vcy; &lcy;&yucy;&bcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy; &Lcy;&icy;&ncy;&ucy;&scy; &ncy;&acy;&shcy;&iecy;&lcy; &icy; &rcy;&iecy;&acy;&lcy;&icy;&zcy;&ocy;&vcy;&acy;&lcy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;  &quot;truly stupid&quot; , &pcy;&ocy;&zcy;&zhcy;&iecy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&ncy;&ycy;&jcy; &Dcy;&zhcy;&ucy;&ncy;&icy;&ocy; &KHcy;&acy;&mcy;&acy;&ncy;&ocy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy; &vcy;&iecy;&scy;&softcy;&mcy;&acy; &khcy;&ocy;&rcy;&ocy;&shcy;&ocy;.</span></p> <p><span data-i18n="468bc9f31378aa0c082cf227f546b3b298744409af39b1d9bb1b044b8e39e1a2/aa" data-source="So the algorithm used by &amp;quot;git bisect&amp;quot; to find the best bisection commit when there are no skipped commits is the following:" onmousemove="i18n(this)">&Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&mcy;&ycy;&jcy;  &quot;git bisect&quot;  &dcy;&lcy;&yacy; &pcy;&ocy;&icy;&scy;&kcy;&acy; &lcy;&ucy;&chcy;&shcy;&iecy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &kcy;&ocy;&gcy;&dcy;&acy; &ncy;&iecy;&tcy; &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ncy;&ycy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;, &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&icy;&jcy;:</span></p> <p><span data-i18n="be70a6aa6fa03de1eb01244c56f60c60367afaf3355d90600d3ba1274c7d0358/0a" data-source="1) keep only the commits that:" onmousemove="i18n(this)">1) &scy;&ocy;&khcy;&rcy;&acy;&ncy;&yacy;&tcy;&softcy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &tcy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy;:</span></p> <p><span data-i18n="46b6a9cb8c73871aa60f68ace3e50c039e08ba255c8432501ecb5d8d7a6e8242/50" data-source="a) are ancestor of the &amp;quot;bad&amp;quot; commit (including the &amp;quot;bad&amp;quot; commit itself), b) are not ancestor of a &amp;quot;good&amp;quot; commit (excluding the &amp;quot;good&amp;quot; commits)." onmousemove="i18n(this)">&acy;) &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot;  (&vcy;&kcy;&lcy;&yucy;&chcy;&acy;&yacy; &scy;&acy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;  &quot;bad&quot; ), &bcy;) &ncy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;good&quot;  (&icy;&scy;&kcy;&lcy;&yucy;&chcy;&acy;&yacy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;  &quot;good&quot; ).</span></p> <p><span data-i18n="57da53a5bcdba9d845681d0bad31fb68dca17b1317f3df0011a29b77a3fa421f/d4" data-source="This means that we get rid of the uninteresting commits in the DAG." onmousemove="i18n(this)">&Ecy;&tcy;&ocy; &zcy;&ncy;&acy;&chcy;&icy;&tcy;, &chcy;&tcy;&ocy; &mcy;&ycy; &icy;&zcy;&bcy;&acy;&vcy;&lcy;&yacy;&iecy;&mcy;&scy;&yacy; &ocy;&tcy; &ncy;&iecy;&icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ncy;&ycy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &vcy; DAG.</span></p> <p><span data-i18n="c5a30341818b8a51c129d67faf45bc4a8c3a08b7ecfaa752baf969f146928b06/39" data-source="For example if we start with a graph like this:" onmousemove="i18n(this)">&Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &iecy;&scy;&lcy;&icy; &mcy;&ycy; &ncy;&acy;&chcy;&ncy;&iecy;&mcy; &scy; &tcy;&acy;&kcy;&ocy;&gcy;&ocy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;&acy;:</span></p> <div> <div> <pre class="hljs language-css">G-Y-G-W-W-W-X-X-X-X
           \ /
            W-W-<span class="hljs-selector-tag">B</span>
           /
Y-<span class="hljs-attr">--G-W---W</span>
 \ /   \
Y-Y     X-X-X-X

-&gt; <span class="hljs-selector-tag">time</span> goes this way -&gt;</pre> </div> </div> <p><span data-i18n="533b740090c2c25a69a80934a4b0b5bada1921f47c0690282b5fb8d6b10c4a39/43" data-source="where B is the &amp;quot;bad&amp;quot; commit, &amp;quot;G&amp;quot; are &amp;quot;good&amp;quot; commits and W, X, and Y are other commits, we will get the following graph after this first step:" onmousemove="i18n(this)">&gcy;&dcy;&iecy; B &mdash; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;  &quot;bad&quot; ,  &quot;G&quot;  &mdash; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;  &quot;good&quot; , &acy; W, X &icy; Y &mdash; &dcy;&rcy;&ucy;&gcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &pcy;&ocy;&scy;&lcy;&iecy; &ecy;&tcy;&ocy;&gcy;&ocy; &pcy;&iecy;&rcy;&vcy;&ocy;&gcy;&ocy; &shcy;&acy;&gcy;&acy; &mcy;&ycy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&mcy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&icy;&jcy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;:</span></p> <div> <div> <pre class="hljs language-css">W-W-W
     \
      W-W-<span class="hljs-selector-tag">B</span>
     /
W-<span class="hljs-attr">--W</span></pre> </div> </div> <p><span data-i18n="26801a3d3678f00a826b2d344f1ec31edd7e925e0b9f658c997f814ba43b0bb2/62" data-source="So only the W and B commits will be kept. Because commits X and Y will have been removed by rules a) and b) respectively, and because commits G are removed by rule b) too." onmousemove="i18n(this)">&Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &bcy;&ucy;&dcy;&ucy;&tcy; &scy;&ocy;&khcy;&rcy;&acy;&ncy;&iecy;&ncy;&ycy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; W &icy; B. &Pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; X &icy; Y &bcy;&ucy;&dcy;&ucy;&tcy; &ucy;&dcy;&acy;&lcy;&iecy;&ncy;&ycy; &pcy;&ocy; &pcy;&rcy;&acy;&vcy;&icy;&lcy;&acy;&mcy; a) &icy; b) &scy;&ocy;&ocy;&tcy;&vcy;&iecy;&tcy;&scy;&tcy;&vcy;&iecy;&ncy;&ncy;&ocy;, &acy; &tcy;&acy;&kcy;&zhcy;&iecy; &pcy;&ocy;&tcy;&ocy;&mcy;&ucy;, &chcy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; G &ucy;&dcy;&acy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &tcy;&acy;&kcy;&zhcy;&iecy; &pcy;&ocy; &pcy;&rcy;&acy;&vcy;&icy;&lcy;&ucy; b).</span></p> <p><span data-i18n="d156e256a6be760a296849950e00278d1373e0389eb98d1e6af39c5f5558e7d0/ff" data-source="Note for Git users, that it is equivalent as keeping only the commit given by:" onmousemove="i18n(this)">&Ocy;&bcy;&rcy;&acy;&tcy;&icy;&tcy;&iecy; &vcy;&ncy;&icy;&mcy;&acy;&ncy;&icy;&iecy; &dcy;&lcy;&yacy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&iecy;&jcy;  Git : &ecy;&tcy;&ocy; &ecy;&kcy;&vcy;&icy;&vcy;&acy;&lcy;&iecy;&ncy;&tcy;&ncy;&ocy; &scy;&ocy;&khcy;&rcy;&acy;&ncy;&iecy;&ncy;&icy;&yucy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&icy;, &zcy;&acy;&dcy;&acy;&ncy;&ncy;&ocy;&jcy;:</span></p> <div> <div> <pre class="hljs language-css">git rev-list BAD <span class="hljs-attr">--not</span> GOOD1 GOOD2...</pre> </div> </div> <p><span data-i18n="5a36325792d52f6424e5c9e1d0aeba76945ee91528f2204eaa1dd97cae424627/49" data-source="Also note that we don&amp;rsquo;t require the commits that are kept to be descendants of a &amp;quot;good&amp;quot; commit. So in the following example, commits W and Z will be kept:" onmousemove="i18n(this)">&Tcy;&acy;&kcy;&zhcy;&iecy; &ocy;&bcy;&rcy;&acy;&tcy;&icy;&tcy;&iecy; &vcy;&ncy;&icy;&mcy;&acy;&ncy;&icy;&iecy;, &chcy;&tcy;&ocy; &mcy;&ycy; &ncy;&iecy; &tcy;&rcy;&iecy;&bcy;&ucy;&iecy;&mcy;, &chcy;&tcy;&ocy;&bcy;&ycy; &scy;&ocy;&khcy;&rcy;&acy;&ncy;&yacy;&iecy;&mcy;&ycy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &bcy;&ycy;&lcy;&icy; &pcy;&ocy;&tcy;&ocy;&mcy;&kcy;&acy;&mcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;good&quot; . &Icy;&tcy;&acy;&kcy;, &vcy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&iecy;&mcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; W &icy; Z &bcy;&ucy;&dcy;&ucy;&tcy; &scy;&ocy;&khcy;&rcy;&acy;&ncy;&iecy;&ncy;&ycy;:</span></p> <div> <div> <pre class="hljs language-css">G-W-W-W-<span class="hljs-selector-tag">B</span>
   /
Z-Z</pre> </div> </div> <p><span data-i18n="471905a3f8e6b6e20c093d7a19d7ea43ee742a515b9463680bfe661a8966166a/1f" data-source="2) starting from the &amp;quot;good&amp;quot; ends of the graph, associate to each commit the number of ancestors it has plus one" onmousemove="i18n(this)">2) &ncy;&acy;&chcy;&icy;&ncy;&acy;&yacy; &scy; &kcy;&ocy;&ncy;&tscy;&ocy;&vcy; &gcy;&rcy;&acy;&fcy;&acy;  &quot;good&quot; , &scy;&vcy;&yacy;&zhcy;&icy;&tcy;&iecy; &scy; &kcy;&acy;&zhcy;&dcy;&ycy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy; &kcy;&ocy;&lcy;&icy;&chcy;&iecy;&scy;&tcy;&vcy;&ocy; &icy;&mcy;&iecy;&yucy;&shchcy;&icy;&khcy;&scy;&yacy; &ucy; &ncy;&iecy;&gcy;&ocy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&vcy; &pcy;&lcy;&yucy;&scy; &ocy;&dcy;&icy;&ncy;</span></p> <p><span data-i18n="919f8b2f77246ec902e994e66628ecbb722507d53a4f66b6775374122cf21487/17" data-source="For example with the following graph where H is the &amp;quot;bad&amp;quot; commit and A and D are some parents of some &amp;quot;good&amp;quot; commits:" onmousemove="i18n(this)">&Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &ncy;&acy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&iecy;&mcy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;&iecy;, &gcy;&dcy;&iecy; H &mdash; &ecy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;  &quot;bad&quot; , &acy; A &icy; D &mdash; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &rcy;&ocy;&dcy;&icy;&tcy;&iecy;&lcy;&softcy;&scy;&kcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy;  &quot;good&quot; :</span></p> <div> <div> <pre class="hljs language-css"><span class="hljs-selector-tag">A</span>-<span class="hljs-selector-tag">B</span>-C
     \
      F-G-H
     /
D-<span class="hljs-attr">--E</span></pre> </div> </div> <p><span data-i18n="61d439a123c3dd52c8f4fc43e7651a9b4a9863d269ad177295dd7387e73777c4/93" data-source="this will give:" onmousemove="i18n(this)">&ecy;&tcy;&ocy; &dcy;&acy;&scy;&tcy;:</span></p> <div> <div> <pre class="hljs language-css"><span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span>
<span class="hljs-selector-tag">A</span>-<span class="hljs-selector-tag">B</span>-C
     \<span class="hljs-number">6</span> <span class="hljs-number">7</span> <span class="hljs-number">8</span>
      F-G-H
<span class="hljs-number">1</span>   <span class="hljs-number">2</span>/
D-<span class="hljs-attr">--E</span></pre> </div> </div> <p><span data-i18n="214c99a8ec085e47034a5a6377a6483183172d6af1fc9f9141b27575a664f96b/f3" data-source="3) associate to each commit: min(X, N - X)" onmousemove="i18n(this)">3) &scy;&vcy;&yacy;&zcy;&acy;&tcy;&softcy; &scy; &kcy;&acy;&zhcy;&dcy;&ycy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy;: min(X, N - X)</span></p> <p><span data-i18n="ed7580feec142f8c5de4e2b9eff8434b452dfb71bc15f3aab0aa65dceedcdd56/25" data-source="where X is the value associated to the commit in step 2) and N is the total number of commits in the graph." onmousemove="i18n(this)">&gcy;&dcy;&iecy; X &mdash; &zcy;&ncy;&acy;&chcy;&iecy;&ncy;&icy;&iecy;, &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ncy;&ocy;&iecy; &scy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&iecy;&jcy; &ncy;&acy; &shcy;&acy;&gcy;&iecy; 2), &acy; N &mdash; &ocy;&bcy;&shchcy;&iecy;&iecy; &kcy;&ocy;&lcy;&icy;&chcy;&iecy;&scy;&tcy;&vcy;&ocy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&jcy; &vcy; &gcy;&rcy;&acy;&fcy;&iecy;.</span></p> <p><span data-i18n="0a6324dd0cf19768d0282a2e84f964c8368e55c2d8b3b66433cdb99b9d90bcb0/95" data-source="In the above example we have N = 8, so this will give:" onmousemove="i18n(this)">&Vcy; &pcy;&rcy;&icy;&vcy;&iecy;&dcy;&iecy;&ncy;&ncy;&ocy;&mcy; &vcy;&ycy;&shcy;&iecy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&iecy; N = 8, &pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &ecy;&tcy;&ocy; &dcy;&acy;&scy;&tcy;:</span></p> <div> <div> <pre class="hljs language-css"><span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span>
<span class="hljs-selector-tag">A</span>-<span class="hljs-selector-tag">B</span>-C
     \<span class="hljs-number">2</span> <span class="hljs-number">1</span> <span class="hljs-number">0</span>
      F-G-H
<span class="hljs-number">1</span>   <span class="hljs-number">2</span>/
D-<span class="hljs-attr">--E</span></pre> </div> </div> <p><span data-i18n="c88766e6e1169f5260c803be4c471cc842e517afeee32befb39aa85e0c79ce10/7d" data-source="4) the best bisection point is the commit with the highest associated number" onmousemove="i18n(this)">4) &lcy;&ucy;&chcy;&shcy;&acy;&yacy; &tcy;&ocy;&chcy;&kcy;&acy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &mdash; &ecy;&tcy;&ocy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yacy; &scy; &ncy;&acy;&icy;&bcy;&ocy;&lcy;&softcy;&shcy;&icy;&mcy; &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ncy;&ycy;&mcy; &ncy;&ocy;&mcy;&iecy;&rcy;&ocy;&mcy;</span></p> <p><span data-i18n="f120dd5edc7255baf7bfa13f0af50d2ca94722074afc614250cb9a32ca570cfa/b7" data-source="So in the above example the best bisection point is commit C." onmousemove="i18n(this)">&Icy;&tcy;&acy;&kcy;, &vcy; &pcy;&rcy;&icy;&vcy;&iecy;&dcy;&iecy;&ncy;&ncy;&ocy;&mcy; &vcy;&ycy;&shcy;&iecy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&iecy; &lcy;&ucy;&chcy;&shcy;&acy;&yacy; &tcy;&ocy;&chcy;&kcy;&acy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &mdash; &ecy;&tcy;&ocy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yacy; C.</span></p> <p><span data-i18n="2665dfcb56ef27e187a9ab255e7141c6fd6dd205e718ae3bad565e26c3a2e8ee/8e" data-source="5) note that some shortcuts are implemented to speed up the algorithm" onmousemove="i18n(this)">5) &ocy;&bcy;&rcy;&acy;&tcy;&icy;&tcy;&iecy; &vcy;&ncy;&icy;&mcy;&acy;&ncy;&icy;&iecy;, &chcy;&tcy;&ocy; &dcy;&lcy;&yacy; &ucy;&scy;&kcy;&ocy;&rcy;&iecy;&ncy;&icy;&yacy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&acy; &rcy;&iecy;&acy;&lcy;&icy;&zcy;&ocy;&vcy;&acy;&ncy;&ycy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &yacy;&rcy;&lcy;&ycy;&kcy;&icy;.</span></p> <p><span data-i18n="4ebe83e2370b9479e7328ccc2cb686326e2f510287bc0a8a6acd19363f186044/24" data-source="As we know N from the beginning, we know that min(X, N - X) can&amp;rsquo;t be greater than N/2. So during steps 2) and 3), if we would associate N/2 to a commit, then we know this is the best bisection point. So in this case we can just stop processing any other commit and return the current commit." onmousemove="i18n(this)">&Pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &mcy;&ycy; &zcy;&ncy;&acy;&iecy;&mcy; N &scy; &scy;&acy;&mcy;&ocy;&gcy;&ocy; &ncy;&acy;&chcy;&acy;&lcy;&acy;, &mcy;&ycy; &zcy;&ncy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; min(X, N - X) &ncy;&iecy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; N/2. &Icy;&tcy;&acy;&kcy;, &iecy;&scy;&lcy;&icy; &ncy;&acy; &shcy;&acy;&gcy;&acy;&khcy; 2) &icy; 3 &mcy;&ycy; &scy;&vcy;&yacy;&zhcy;&iecy;&mcy; N/2 &scy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&iecy;&jcy;, &tcy;&ocy; &mcy;&ycy; &zcy;&ncy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; &ecy;&tcy;&ocy; &lcy;&ucy;&chcy;&shcy;&acy;&yacy; &tcy;&ocy;&chcy;&kcy;&acy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;. &Icy;&tcy;&acy;&kcy;, &vcy; &ecy;&tcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy; &mcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&mcy; &pcy;&rcy;&ocy;&scy;&tcy;&ocy; &pcy;&rcy;&iecy;&kcy;&rcy;&acy;&tcy;&icy;&tcy;&softcy; &ocy;&bcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&ucy; &lcy;&yucy;&bcy;&ocy;&gcy;&ocy; &dcy;&rcy;&ucy;&gcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy; &icy; &vcy;&iecy;&rcy;&ncy;&ucy;&tcy;&softcy; &tcy;&iecy;&kcy;&ucy;&shchcy;&icy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_bisection_algorithm_debugging"><span data-i18n="08bd5a22bce0518b229651401cdee9c545bc231c89bb9d8a3b292e8de62a8f37/8c" data-source="Bisection algorithm debugging" onmousemove="i18n(this)">&Ocy;&tcy;&lcy;&acy;&dcy;&kcy;&acy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&acy; &bcy;&icy;&scy;&iecy;&kcy;&tscy;&icy;&icy;</span></h3> <p><span data-i18n="45ac2bf66b62ee595e7d2976fd16f76f89bdc11c21fce418a0ea67706c937ed7/8f" data-source="For any commit graph, you can see the number associated with each commit using &amp;quot;git rev-list --bisect-all&amp;quot;." onmousemove="i18n(this)">&Dcy;&lcy;&yacy; &lcy;&yucy;&bcy;&ocy;&gcy;&ocy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;&acy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &ucy;&vcy;&icy;&dcy;&iecy;&tcy;&softcy; &ncy;&ocy;&mcy;&iecy;&rcy;, &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ncy;&ycy;&jcy; &scy; &kcy;&acy;&zhcy;&dcy;&ycy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy;, &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy;  &quot;git rev-list --bisect-all&quot; .</span></p> <p><span data-i18n="d00794ece1391ada9799ecfe224aca1fae799d4e276cbd92c99188db675a72a0/44" data-source="For example, for the above graph, a command like:" onmousemove="i18n(this)">&Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &dcy;&lcy;&yacy; &pcy;&rcy;&icy;&vcy;&iecy;&dcy;&iecy;&ncy;&ncy;&ocy;&gcy;&ocy; &vcy;&ycy;&shcy;&iecy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;&acy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;&acy; &tcy;&icy;&pcy;&acy;:</span></p> <div> <div> <pre class="hljs language-scss">$ git rev-list <span class="hljs-attr">--bisect-all</span> BAD <span class="hljs-attr">--not</span> GOOD1 GOOD2</pre> </div> </div> <p><span data-i18n="5a7d5a69fae0f0619536de652243406ce95936e30e49d5a309c86774902a2cd9/2a" data-source="would output something like:" onmousemove="i18n(this)">&vcy;&ycy;&vcy;&iecy;&dcy;&iecy;&tcy; &chcy;&tcy;&ocy;-&tcy;&ocy; &vcy;&rcy;&ocy;&dcy;&iecy;:</span></p> <div> <div> <pre class="hljs language-scss">e15b73ad3db9b48d7d1ade32f8cd23a751fe0ace (dist=<span class="hljs-number">3</span>)
<span class="hljs-number">15722</span>f2fa328eaba97022898a305ffc8172db6b1 (dist=<span class="hljs-number">2</span>)
<span class="hljs-number">78</span>e86cf3e850bd755bb71831f42e200626fbd1e0 (dist=<span class="hljs-number">2</span>)
a1939d9a142de972094af4dde9a544e577ddef0e (dist=<span class="hljs-number">2</span>)
<span class="hljs-number">070</span>eab2303024706f2924822bfec8b9847e4ac1b (dist=<span class="hljs-number">1</span>)
a3864d4f32a3bf5ed177ddef598490a08760b70d (dist=<span class="hljs-number">1</span>)
a41baa717dd74f1180abf55e9341bc7a0bb9d556 (dist=<span class="hljs-number">1</span>)
<span class="hljs-number">9</span>e622a6dad403b71c40979743bb9d5be17b16bd6 (dist=<span class="hljs-number">0</span>)</pre> </div> </div> </div> <div> <h3 class="text-body-emphasis"  id="_bisection_algorithm_discussed"><span data-i18n="8c74344f695e8ede7df290a967b7803518f461556de43612bb74b876a4917885/e4" data-source="Bisection algorithm discussed" onmousemove="i18n(this)">&Ocy;&bcy;&scy;&ucy;&zhcy;&dcy;&acy;&iecy;&tcy;&scy;&yacy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy; &bcy;&icy;&scy;&iecy;&kcy;&tscy;&icy;&icy;</span></h3> <p><span data-i18n="63eba44c50707ff220391427b5ab57e5bf6408f72fc00405428935ec8f6bc227/40" data-source="First let&amp;rsquo;s define &amp;quot;best bisection point&amp;quot;. We will say that a commit X is a best bisection point or a best bisection commit if knowing its state (&amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;) gives as much information as possible whether the state of the commit happens to be &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot;." onmousemove="i18n(this)">&Scy;&ncy;&acy;&chcy;&acy;&lcy;&acy; &dcy;&acy;&vcy;&acy;&jcy;&tcy;&iecy; &ocy;&pcy;&rcy;&iecy;&dcy;&iecy;&lcy;&icy;&mcy;  &quot;best bisection point&quot; . &Mcy;&ycy; &scy;&kcy;&acy;&zhcy;&iecy;&mcy;, &chcy;&tcy;&ocy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yacy; X &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &lcy;&ucy;&chcy;&shcy;&iecy;&jcy; &tcy;&ocy;&chcy;&kcy;&ocy;&jcy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &icy;&lcy;&icy; &lcy;&ucy;&chcy;&shcy;&iecy;&jcy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&iecy;&jcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &iecy;&scy;&lcy;&icy; &zcy;&ncy;&acy;&ncy;&icy;&iecy; &iecy;&gcy;&ocy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&yacy; ( &quot;good&quot;  &icy;&lcy;&icy;  &quot;bad&quot; ) &dcy;&acy;&iecy;&tcy; &kcy;&acy;&kcy; &mcy;&ocy;&zhcy;&ncy;&ocy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy; &ocy; &tcy;&ocy;&mcy;, &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &lcy;&icy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&iecy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&icy;  &quot;good&quot;  &icy;&lcy;&icy;  &quot;bad&quot; .</span></p> <p><span data-i18n="a276630bc2749830f9312a8c24faa3de7467dda5b88c323bfecd4656fa17b815/c7" data-source="This means that the best bisection commits are the commits where the following function is maximum:" onmousemove="i18n(this)">&Ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &lcy;&ucy;&chcy;&shcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &mdash; &ecy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &vcy; &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&acy;&yacy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&yacy; &mcy;&acy;&kcy;&scy;&icy;&mcy;&acy;&lcy;&softcy;&ncy;&acy;:</span></p> <div> <div> <pre class="hljs language-lua">f(X) = <span class="hljs-built_in">min</span>(information_if_good(X), information_if_bad(X))</pre> </div> </div> <p><span data-i18n="df85670b25f47599a678ca8ccfa4d0cf1a96a74b586e5ea45442a7396bfd7c6a/66" data-source="where information_if_good(X) is the information we get if X is good and information_if_bad(X) is the information we get if X is bad." onmousemove="i18n(this)">&gcy;&dcy;&iecy; information_if_good(X) &mdash; &ecy;&tcy;&ocy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&yacy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ucy;&yucy; &mcy;&ycy; &pcy;&ocy;&lcy;&ucy;&chcy;&acy;&iecy;&mcy;, &iecy;&scy;&lcy;&icy; X &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&jcy;, &acy; information_if_bad(X) &mdash; &ecy;&tcy;&ocy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&yacy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ucy;&yucy; &mcy;&ycy; &pcy;&ocy;&lcy;&ucy;&chcy;&acy;&iecy;&mcy;, &iecy;&scy;&lcy;&icy; X &pcy;&lcy;&ocy;&khcy;&ocy;&jcy;.</span></p> <p><span data-i18n="b73597e2834b33ce2ab17ba50aa9f40be408c15549ace31412befc3c5d7fa934/ba" data-source="Now we will suppose that there is only one &amp;quot;first bad commit&amp;quot;. This means that all its descendants are &amp;quot;bad&amp;quot; and all the other commits are &amp;quot;good&amp;quot;. And we will suppose that all commits have an equal probability of being good or bad, or of being the first bad commit, so knowing the state of c commits gives always the same amount of information wherever these c commits are on the graph and whatever c is. (So we suppose that these commits being for example on a branch or near a good or a bad commit does not give more or less information)." onmousemove="i18n(this)">&Tcy;&iecy;&pcy;&iecy;&rcy;&softcy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&ocy;&zhcy;&icy;&mcy;, &chcy;&tcy;&ocy; &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &ocy;&dcy;&icy;&ncy;  &quot;first bad commit&quot; . &Ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &vcy;&scy;&iecy; &iecy;&gcy;&ocy; &pcy;&ocy;&tcy;&ocy;&mcy;&kcy;&icy; &mdash;  &quot;bad&quot; , &acy; &vcy;&scy;&iecy; &ocy;&scy;&tcy;&acy;&lcy;&softcy;&ncy;&ycy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &mdash;  &quot;good&quot; . &Icy; &mcy;&ycy; &bcy;&ucy;&dcy;&iecy;&mcy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&tcy;&softcy;, &chcy;&tcy;&ocy; &vcy;&scy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &icy;&mcy;&iecy;&yucy;&tcy; &rcy;&acy;&vcy;&ncy;&ucy;&yucy; &vcy;&iecy;&rcy;&ocy;&yacy;&tcy;&ncy;&ocy;&scy;&tcy;&softcy; &bcy;&ycy;&tcy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&mcy;&icy; &icy;&lcy;&icy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy;&icy; &icy;&lcy;&icy; &bcy;&ycy;&tcy;&softcy; &pcy;&iecy;&rcy;&vcy;&ycy;&mcy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy;, &pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &zcy;&ncy;&acy;&ncy;&icy;&iecy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&yacy; c &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &vcy;&scy;&iecy;&gcy;&dcy;&acy; &dcy;&acy;&iecy;&tcy; &ocy;&dcy;&icy;&ncy;&acy;&kcy;&ocy;&vcy;&ocy;&iecy; &kcy;&ocy;&lcy;&icy;&chcy;&iecy;&scy;&tcy;&vcy;&ocy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy;, &gcy;&dcy;&iecy; &bcy;&ycy; &ecy;&tcy;&icy; c &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &ncy;&icy; &ncy;&acy;&khcy;&ocy;&dcy;&icy;&lcy;&icy;&scy;&softcy; &ncy;&acy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;&iecy;, &icy; &ncy;&iecy;&zcy;&acy;&vcy;&icy;&scy;&icy;&mcy;&ocy; &ocy;&tcy; &tcy;&ocy;&gcy;&ocy;, &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy;. (&Pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &mcy;&ycy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; &ecy;&tcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &ncy;&acy;&khcy;&ocy;&dcy;&yacy;&shchcy;&icy;&iecy;&scy;&yacy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &vcy; &vcy;&iecy;&tcy;&kcy;&iecy; &icy;&lcy;&icy; &rcy;&yacy;&dcy;&ocy;&mcy; &scy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&mcy; &icy;&lcy;&icy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy;, &ncy;&iecy; &dcy;&acy;&yucy;&tcy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &icy;&lcy;&icy; &mcy;&iecy;&ncy;&softcy;&shcy;&iecy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy;).</span></p> <p><span data-i18n="16e13d9c8a41402ad83220ee27a161dbbd05ca6c7f06f3e292c47e9c330f9828/e5" data-source="Let&amp;rsquo;s also suppose that we have a cleaned up graph like one after step 1) in the bisection algorithm above. This means that we can measure the information we get in terms of number of commit we can remove from the graph.." onmousemove="i18n(this)">&Pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&ocy;&zhcy;&icy;&mcy; &tcy;&acy;&kcy;&zhcy;&iecy;, &chcy;&tcy;&ocy; &ucy; &ncy;&acy;&scy; &iecy;&scy;&tcy;&softcy; &ocy;&chcy;&icy;&shchcy;&iecy;&ncy;&ncy;&ycy;&jcy; &gcy;&rcy;&acy;&fcy;, &pcy;&ocy;&dcy;&ocy;&bcy;&ncy;&ycy;&jcy; &gcy;&rcy;&acy;&fcy;&ucy; &pcy;&ocy;&scy;&lcy;&iecy; &shcy;&acy;&gcy;&acy; 1) &vcy; &pcy;&rcy;&icy;&vcy;&iecy;&dcy;&iecy;&ncy;&ncy;&ocy;&mcy; &vcy;&ycy;&shcy;&iecy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&iecy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;. &Ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &mcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&mcy; &icy;&zcy;&mcy;&iecy;&rcy;&icy;&tcy;&softcy; &pcy;&ocy;&lcy;&ucy;&chcy;&acy;&iecy;&mcy;&ucy;&yucy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&yucy; &scy; &tcy;&ocy;&chcy;&kcy;&icy; &zcy;&rcy;&iecy;&ncy;&icy;&yacy; &kcy;&ocy;&lcy;&icy;&chcy;&iecy;&scy;&tcy;&vcy;&acy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &mcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&mcy; &ucy;&dcy;&acy;&lcy;&icy;&tcy;&softcy; &icy;&zcy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;&acy;.</span></p> <p><span data-i18n="59d6aa0547d36cda7102549aaf7dce292e763396ce2d66c68440d80dc1c90fbc/0a" data-source="And let&amp;rsquo;s take a commit X in the graph." onmousemove="i18n(this)">&Icy; &dcy;&acy;&vcy;&acy;&jcy;&tcy;&iecy; &vcy;&ocy;&zcy;&softcy;&mcy;&iecy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; X &ncy;&acy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;&iecy;.</span></p> <p><span data-i18n="5aa9fa26b9bce76a11d814bc5dafa65d17d1e2e9a79e308c75a53c16fde53fd4/ec" data-source="If X is found to be &amp;quot;good&amp;quot;, then we know that its ancestors are all &amp;quot;good&amp;quot;, so we want to say that:" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&iecy;&ncy;&ocy;, &chcy;&tcy;&ocy; X &mdash; &ecy;&tcy;&ocy;  &quot;good&quot; , &tcy;&ocy; &mcy;&ycy; &zcy;&ncy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; &vcy;&scy;&iecy; &iecy;&gcy;&ocy; &pcy;&rcy;&iecy;&dcy;&kcy;&icy; &mdash;  &quot;good&quot; , &pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &mcy;&ycy; &khcy;&ocy;&tcy;&icy;&mcy; &scy;&kcy;&acy;&zcy;&acy;&tcy;&softcy;, &chcy;&tcy;&ocy;:</span></p> <div> <div> <pre class="hljs language-graphql">information_if_good<span class="hljs-punctuation">(</span>X<span class="hljs-punctuation">)</span> <span class="hljs-punctuation">=</span> number_of_ancestors<span class="hljs-punctuation">(</span>X<span class="hljs-punctuation">)</span>  <span class="hljs-punctuation">(</span><span class="hljs-literal">TRUE</span><span class="hljs-punctuation">)</span></pre> </div> </div> <p><span data-i18n="eed57c29c90a9cdec2adaf03919b8af4ae1a19ee4d428fa4441ddbb1c47d3a76/65" data-source="And this is true because at step 1) b) we remove the ancestors of the &amp;quot;good&amp;quot; commits." onmousemove="i18n(this)">&Acy; &ecy;&tcy;&ocy;  true , &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &ncy;&acy; &shcy;&acy;&gcy;&iecy; 1)&bcy;) &mcy;&ycy; &ucy;&dcy;&acy;&lcy;&yacy;&iecy;&mcy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&vcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;  &quot;good&quot; .</span></p> <p><span data-i18n="6638b1dc8ccef747adcee96ae053066887b677773ed0955617ce8fc68210f973/74" data-source="If X is found to be &amp;quot;bad&amp;quot;, then we know that its descendants are all &amp;quot;bad&amp;quot;, so we want to say that:" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&iecy;&ncy;&ocy;, &chcy;&tcy;&ocy; X &mdash; &ecy;&tcy;&ocy;  &quot;bad&quot; , &tcy;&ocy; &mcy;&ycy; &zcy;&ncy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; &vcy;&scy;&iecy; &iecy;&gcy;&ocy; &pcy;&ocy;&tcy;&ocy;&mcy;&kcy;&icy; &mdash;  &quot;bad&quot; , &pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &mcy;&ycy; &khcy;&ocy;&tcy;&icy;&mcy; &scy;&kcy;&acy;&zcy;&acy;&tcy;&softcy;, &chcy;&tcy;&ocy;:</span></p> <div> <div> <pre class="hljs language-undefined">information_if_bad(X) = number_of_descendants(X)  (WRONG)</pre> </div> </div> <p><span data-i18n="b914ccdcb155fb1c457beb56924a7946e53b8a5e7c9ff2f6de7a171814f9b354/c4" data-source="But this is wrong because at step 1) a) we keep only the ancestors of the bad commit. So we get more information when a commit is marked as &amp;quot;bad&amp;quot;, because we also know that the ancestors of the previous &amp;quot;bad&amp;quot; commit that are not ancestors of the new &amp;quot;bad&amp;quot; commit are not the first bad commit. We don&amp;rsquo;t know if they are good or bad, but we know that they are not the first bad commit because they are not ancestor of the new &amp;quot;bad&amp;quot; commit." onmousemove="i18n(this)">&Ncy;&ocy; &ecy;&tcy;&ocy; &ncy;&iecy;&pcy;&rcy;&acy;&vcy;&icy;&lcy;&softcy;&ncy;&ocy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &ncy;&acy; &shcy;&acy;&gcy;&iecy; 1) &acy;) &mcy;&ycy; &scy;&ocy;&khcy;&rcy;&acy;&ncy;&yacy;&iecy;&mcy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&vcy; &pcy;&lcy;&ocy;&khcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;. &Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &mcy;&ycy; &pcy;&ocy;&lcy;&ucy;&chcy;&acy;&iecy;&mcy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy;, &kcy;&ocy;&gcy;&dcy;&acy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &pcy;&ocy;&mcy;&iecy;&chcy;&iecy;&ncy; &kcy;&acy;&kcy;  &quot;bad&quot; , &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &mcy;&ycy; &tcy;&acy;&kcy;&zhcy;&iecy; &zcy;&ncy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; &pcy;&rcy;&iecy;&dcy;&kcy;&icy; &pcy;&rcy;&iecy;&dcy;&ycy;&dcy;&ucy;&shchcy;&iecy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot; , &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ncy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&rcy;&iecy;&dcy;&kcy;&acy;&mcy;&icy; &ncy;&ocy;&vcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot; , &ncy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&iecy;&rcy;&vcy;&ycy;&mcy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy;. &Mcy;&ycy; &ncy;&iecy; &zcy;&ncy;&acy;&iecy;&mcy;, &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&iecy; &ocy;&ncy;&icy; &icy;&lcy;&icy; &pcy;&lcy;&ocy;&khcy;&icy;&iecy;, &ncy;&ocy; &mcy;&ycy; &zcy;&ncy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; &ecy;&tcy;&ocy; &ncy;&iecy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ocy;&ncy;&icy; &ncy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&rcy;&iecy;&dcy;&kcy;&acy;&mcy;&icy; &ncy;&ocy;&vcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot; .</span></p> <p><span data-i18n="0f65fb0999ff22df956380bf6697a16d4149a578d909498e21cb112258017e4c/9a" data-source="So when a commit is marked as &amp;quot;bad&amp;quot; we know we can remove all the commits in the graph except those that are ancestors of the new &amp;quot;bad&amp;quot; commit. This means that:" onmousemove="i18n(this)">&Pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy;, &kcy;&ocy;&gcy;&dcy;&acy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &pcy;&ocy;&mcy;&iecy;&chcy;&iecy;&ncy; &kcy;&acy;&kcy;  &quot;bad&quot; , &mcy;&ycy; &zcy;&ncy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; &mcy;&ocy;&zhcy;&iecy;&mcy; &ucy;&dcy;&acy;&lcy;&icy;&tcy;&softcy; &vcy;&scy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &vcy; &gcy;&rcy;&acy;&fcy;&iecy;, &kcy;&rcy;&ocy;&mcy;&iecy; &tcy;&iecy;&khcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&rcy;&iecy;&dcy;&kcy;&acy;&mcy;&icy; &ncy;&ocy;&vcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot; . &Ecy;&tcy;&ocy; &zcy;&ncy;&acy;&chcy;&icy;&tcy;, &chcy;&tcy;&ocy;:</span></p> <div> <div> <pre class="hljs language-graphql">information_if_bad<span class="hljs-punctuation">(</span>X<span class="hljs-punctuation">)</span> <span class="hljs-punctuation">=</span> N - number_of_ancestors<span class="hljs-punctuation">(</span>X<span class="hljs-punctuation">)</span>  <span class="hljs-punctuation">(</span><span class="hljs-literal">TRUE</span><span class="hljs-punctuation">)</span></pre> </div> </div> <p><span data-i18n="ae14741a9263f56436a3458ed6aa537f8c4f39d53a7d516469bdef65569235d0/57" data-source="where N is the number of commits in the (cleaned up) graph." onmousemove="i18n(this)">&gcy;&dcy;&iecy; N &mdash; &kcy;&ocy;&lcy;&icy;&chcy;&iecy;&scy;&tcy;&vcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &vcy; (&ocy;&chcy;&icy;&shchcy;&iecy;&ncy;&ncy;&ocy;&mcy;) &gcy;&rcy;&acy;&fcy;&iecy;.</span></p> <p><span data-i18n="6a7cfc6ef3e38085a97841f21a083260a200b6c221790618247101c3e2baf29d/7a" data-source="So in the end this means that to find the best bisection commits we should maximize the function:" onmousemove="i18n(this)">&Vcy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;&mcy; &icy;&tcy;&ocy;&gcy;&iecy; &ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &dcy;&lcy;&yacy; &pcy;&ocy;&icy;&scy;&kcy;&acy; &lcy;&ucy;&chcy;&shcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &mcy;&ycy; &dcy;&ocy;&lcy;&zhcy;&ncy;&ycy; &mcy;&acy;&kcy;&scy;&icy;&mcy;&icy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&yucy;:</span></p> <div> <div> <pre class="hljs language-lua">f(X) = <span class="hljs-built_in">min</span>(number_of_ancestors(X), N - number_of_ancestors(X))</pre> </div> </div> <p><span data-i18n="934070cee448769750aba119e383da75e07f03cd0074512a0767ba42a3ef0723/7c" data-source="And this is nice because at step 2) we compute number_of_ancestors(X) and so at step 3) we compute f(X)." onmousemove="i18n(this)">&Icy; &ecy;&tcy;&ocy; &khcy;&ocy;&rcy;&ocy;&shcy;&ocy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &ncy;&acy; &shcy;&acy;&gcy;&iecy; 2) &mcy;&ycy; &vcy;&ycy;&chcy;&icy;&scy;&lcy;&yacy;&iecy;&mcy; &chcy;&icy;&scy;&lcy;&ocy;_&pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&vcy;(X), &acy; &zcy;&acy;&tcy;&iecy;&mcy; &ncy;&acy; &shcy;&acy;&gcy;&iecy; 3) &mcy;&ycy; &vcy;&ycy;&chcy;&icy;&scy;&lcy;&yacy;&iecy;&mcy; f(X).</span></p> <p><span data-i18n="05539337ba2e59ea95a538fd8ba83fbd92e5cf78dc51d23edcd95511d91962eb/0f" data-source="Let&amp;rsquo;s take the following graph as an example:" onmousemove="i18n(this)">&Vcy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&iecy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&acy; &vcy;&ocy;&zcy;&softcy;&mcy;&iecy;&mcy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&icy;&jcy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;:</span></p> <div> <div> <pre class="hljs language-css">            G-H-<span class="hljs-selector-tag">I</span>-J
           /       \
<span class="hljs-selector-tag">A</span>-<span class="hljs-selector-tag">B</span>-C-D-E-F         O
           \       /
            K-L-M-N</pre> </div> </div> <p><span data-i18n="98a67b7082d75c282fc2b2327ec1016f83db7441d19a93346ec565e6c0122a06/1e" data-source="If we compute the following non optimal function on it:" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &mcy;&ycy; &vcy;&ycy;&chcy;&icy;&scy;&lcy;&icy;&mcy; &ncy;&acy; &ncy;&iecy;&mcy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&ucy;&yucy; &ncy;&iecy;&ocy;&pcy;&tcy;&icy;&mcy;&acy;&lcy;&softcy;&ncy;&ucy;&yucy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&yucy;:</span></p> <div> <div> <pre class="hljs language-lua">g(X) = <span class="hljs-built_in">min</span>(number_of_ancestors(X), number_of_descendants(X))</pre> </div> </div> <p><span data-i18n="34b29cbfa94bdbed0512816d3289505cdda42bcfb3e41a866bc3b3b9830d092f/2c" data-source="we get:" onmousemove="i18n(this)">we get:</span></p> <div> <div> <pre class="hljs language-css">            <span class="hljs-number">4</span> <span class="hljs-number">3</span> <span class="hljs-number">2</span> <span class="hljs-number">1</span>
            G-H-<span class="hljs-selector-tag">I</span>-J
<span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">4</span> <span class="hljs-number">5</span> <span class="hljs-number">6</span>/       \<span class="hljs-number">0</span>
<span class="hljs-selector-tag">A</span>-<span class="hljs-selector-tag">B</span>-C-D-E-F         O
           \       /
            K-L-M-N
            <span class="hljs-number">4</span> <span class="hljs-number">3</span> <span class="hljs-number">2</span> <span class="hljs-number">1</span></pre> </div> </div> <p><span data-i18n="1fcd6a3ee049455574047afd0d959772093fe0edc71533d6cc43d1936c8b2957/92" data-source="but with the algorithm used by git bisect we get:" onmousemove="i18n(this)">&ncy;&ocy; &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&acy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&mcy;&ocy;&gcy;&ocy;  git  &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &mcy;&ycy; &pcy;&ocy;&lcy;&ucy;&chcy;&acy;&iecy;&mcy;:</span></p> <div> <div> <pre class="hljs language-css">            <span class="hljs-number">7</span> <span class="hljs-number">7</span> <span class="hljs-number">6</span> <span class="hljs-number">5</span>
            G-H-<span class="hljs-selector-tag">I</span>-J
<span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">4</span> <span class="hljs-number">5</span> <span class="hljs-number">6</span>/       \<span class="hljs-number">0</span>
<span class="hljs-selector-tag">A</span>-<span class="hljs-selector-tag">B</span>-C-D-E-F         O
           \       /
            K-L-M-N
            <span class="hljs-number">7</span> <span class="hljs-number">7</span> <span class="hljs-number">6</span> <span class="hljs-number">5</span></pre> </div> </div> <p><span data-i18n="3978c3aea3cf59e0c09eb0283d4f57612bf1f7513a4c015aeb018bd60123be5f/7a" data-source="So we chose G, H, K or L as the best bisection point, which is better than F. Because if for example L is bad, then we will know not only that L, M and N are bad but also that G, H, I and J are not the first bad commit (since we suppose that there is only one first bad commit and it must be an ancestor of L)." onmousemove="i18n(this)">&Pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &mcy;&ycy; &vcy;&ycy;&bcy;&rcy;&acy;&lcy;&icy; G, H, K &icy;&lcy;&icy; L &vcy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&iecy; &lcy;&ucy;&chcy;&shcy;&iecy;&jcy; &tcy;&ocy;&chcy;&kcy;&icy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy;, &chcy;&tcy;&ocy; &lcy;&ucy;&chcy;&shcy;&iecy;, &chcy;&iecy;&mcy; F. &Pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy;, &iecy;&scy;&lcy;&icy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, L &pcy;&lcy;&ocy;&khcy;&acy;&yacy;, &tcy;&ocy; &mcy;&ycy; &bcy;&ucy;&dcy;&iecy;&mcy; &zcy;&ncy;&acy;&tcy;&softcy; &ncy;&iecy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy;, &chcy;&tcy;&ocy; L, M &icy; N &pcy;&lcy;&ocy;&khcy;&icy;&iecy;, &ncy;&ocy; &tcy;&acy;&kcy;&zhcy;&iecy; &icy; &chcy;&tcy;&ocy; G, H , I &icy; J &ncy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&iecy;&rcy;&vcy;&ycy;&mcy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy; (&pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &mcy;&ycy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &ocy;&dcy;&icy;&ncy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &icy; &ocy;&ncy; &dcy;&ocy;&lcy;&zhcy;&iecy;&ncy; &bcy;&ycy;&tcy;&softcy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&mcy; L).</span></p> <p><span data-i18n="7acfdb089513278ca3fe6d28cc89bd61ec55b895ff5f84cbbf7cabebc1dc6f25/52" data-source="So the current algorithm seems to be the best possible given what we initially supposed." onmousemove="i18n(this)">&Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &tcy;&iecy;&kcy;&ucy;&shchcy;&icy;&jcy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy; &kcy;&acy;&zhcy;&iecy;&tcy;&scy;&yacy; &ncy;&acy;&icy;&lcy;&ucy;&chcy;&shcy;&icy;&mcy; &icy;&zcy; &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ycy;&khcy;, &ucy;&chcy;&icy;&tcy;&ycy;&vcy;&acy;&yacy; &tcy;&ocy;, &chcy;&tcy;&ocy; &mcy;&ycy; &icy;&zcy;&ncy;&acy;&chcy;&acy;&lcy;&softcy;&ncy;&ocy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&lcy;&icy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_skip_algorithm"><span data-i18n="01dd9e982255b5cac46efa888f0c7118430db75262c2c6c63cdd307bf87b6527/c1" data-source="Skip algorithm" onmousemove="i18n(this)">Skip algorithm</span></h3> <p><span data-i18n="d79b98ac0c7d6461ab982fe9b6532b791fb51ff09c56e305f6aca068c4961544/c8" data-source="When some commits have been skipped (using &amp;quot;git bisect skip&amp;quot;), then the bisection algorithm is the same for step 1) to 3). But then we use roughly the following steps:" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &bcy;&ycy;&lcy;&icy; &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ycy; (&scy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy;&mcy;  &quot;git bisect skip&quot; ), &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &tcy;&ocy;&tcy; &zhcy;&iecy;, &chcy;&tcy;&ocy; &icy; &dcy;&lcy;&yacy; &shcy;&acy;&gcy;&ocy;&vcy; &scy; 1) &pcy;&ocy; 3). &Ncy;&ocy; &tcy;&ocy;&gcy;&dcy;&acy; &mcy;&ycy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&mcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&ncy;&ocy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&icy;&iecy; &shcy;&acy;&gcy;&icy;:</span></p> <p><span data-i18n="b4e2c3838cb4cb57ff6e567f13552bc47b53cc87d5ee1fb97c6f8f45dcd2ea9c/7a" data-source="6) sort the commit by decreasing associated value" onmousemove="i18n(this)">6) &ocy;&tcy;&scy;&ocy;&rcy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &ucy;&mcy;&iecy;&ncy;&softcy;&shcy;&icy;&vcy; &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ncy;&ocy;&iecy; &zcy;&ncy;&acy;&chcy;&iecy;&ncy;&icy;&iecy;</span></p> <p><span data-i18n="0f7aaede06a7925a51243a4e9264b6fdf015a5d0e43f9dc18fea6b939fb32477/5f" data-source="7) if the first commit has not been skipped, we can return it and stop here" onmousemove="i18n(this)">7) &iecy;&scy;&lcy;&icy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &ncy;&iecy; &bcy;&ycy;&lcy; &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;, &mcy;&ocy;&zhcy;&iecy;&mcy; &iecy;&gcy;&ocy; &vcy;&iecy;&rcy;&ncy;&ucy;&tcy;&softcy; &icy; &ncy;&acy; &ecy;&tcy;&ocy;&mcy; &ocy;&scy;&tcy;&acy;&ncy;&ocy;&vcy;&icy;&tcy;&softcy;&scy;&yacy;</span></p> <p><span data-i18n="ecc85a81987813215a08aac9cfbc7fb06e41c6a99a38bc62acc15e18de22e1cc/d3" data-source="8) otherwise filter out all the skipped commits in the sorted list" onmousemove="i18n(this)">8) &icy;&ncy;&acy;&chcy;&iecy; &ocy;&tcy;&fcy;&icy;&lcy;&softcy;&tcy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &vcy;&scy;&iecy; &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ncy;&ycy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &vcy; &ocy;&tcy;&scy;&ocy;&rcy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&ncy;&ocy;&mcy; &scy;&pcy;&icy;&scy;&kcy;&iecy;</span></p> <p><span data-i18n="14f33b4845ecdd38c2dac4171450baddb72e6bb75a54f0cef357631f07355693/99" data-source="9) use a pseudo random number generator (PRNG) to generate a random number between 0 and 1" onmousemove="i18n(this)">9) &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &gcy;&iecy;&ncy;&iecy;&rcy;&acy;&tcy;&ocy;&rcy; &pcy;&scy;&iecy;&vcy;&dcy;&ocy;&scy;&lcy;&ucy;&chcy;&acy;&jcy;&ncy;&ycy;&khcy; &chcy;&icy;&scy;&iecy;&lcy; (PRNG) &dcy;&lcy;&yacy; &gcy;&iecy;&ncy;&iecy;&rcy;&acy;&tscy;&icy;&icy; &scy;&lcy;&ucy;&chcy;&acy;&jcy;&ncy;&ocy;&gcy;&ocy; &chcy;&icy;&scy;&lcy;&acy; &ocy;&tcy; 0 &dcy;&ocy; 1.</span></p> <p><span data-i18n="7173c38b4732c3d3134709a342918abdbd2a55a1eef5ae65b3c890f71080ca93/14" data-source="10) multiply this random number with its square root to bias it toward 0" onmousemove="i18n(this)">10) &ucy;&mcy;&ncy;&ocy;&zhcy;&softcy;&tcy;&iecy; &ecy;&tcy;&ocy; &scy;&lcy;&ucy;&chcy;&acy;&jcy;&ncy;&ocy;&iecy; &chcy;&icy;&scy;&lcy;&ocy; &ncy;&acy; &iecy;&gcy;&ocy; &kcy;&vcy;&acy;&dcy;&rcy;&acy;&tcy;&ncy;&ycy;&jcy; &kcy;&ocy;&rcy;&iecy;&ncy;&softcy;, &chcy;&tcy;&ocy;&bcy;&ycy; &scy;&mcy;&iecy;&scy;&tcy;&icy;&tcy;&softcy; &iecy;&gcy;&ocy; &kcy; 0.</span></p> <p><span data-i18n="068c65f3567d3a51ef7410170eb4fd7eb4fa91ae4d7773024b17f71dafa8d7c3/32" data-source="11) multiply the result by the number of commits in the filtered list to get an index into this list" onmousemove="i18n(this)">11) &ucy;&mcy;&ncy;&ocy;&zhcy;&icy;&tcy;&softcy; &rcy;&iecy;&zcy;&ucy;&lcy;&softcy;&tcy;&acy;&tcy; &ncy;&acy; &kcy;&ocy;&lcy;&icy;&chcy;&iecy;&scy;&tcy;&vcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &vcy; &ocy;&tcy;&fcy;&icy;&lcy;&softcy;&tcy;&rcy;&ocy;&vcy;&acy;&ncy;&ncy;&ocy;&mcy; &scy;&pcy;&icy;&scy;&kcy;&iecy;, &chcy;&tcy;&ocy;&bcy;&ycy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy; &icy;&ncy;&dcy;&iecy;&kcy;&scy; &vcy; &ecy;&tcy;&ocy;&mcy; &scy;&pcy;&icy;&scy;&kcy;&iecy;</span></p> <p><span data-i18n="1ea96db17168d80e2b9616a9c2582508196077d3c05adb3467beafc265ff659e/41" data-source="12) return the commit at the computed index" onmousemove="i18n(this)">12) &vcy;&iecy;&rcy;&ncy;&ucy;&tcy;&softcy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yucy; &pcy;&ocy; &vcy;&ycy;&chcy;&icy;&scy;&lcy;&iecy;&ncy;&ncy;&ocy;&mcy;&ucy; &icy;&ncy;&dcy;&iecy;&kcy;&scy;&ucy;</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_skip_algorithm_discussed"><span data-i18n="ef772ca7e772c68c3489c0a67ab24d3c3f433a90758a53dad451eae2f1c43c2a/1b" data-source="Skip algorithm discussed" onmousemove="i18n(this)">&Acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy; &pcy;&rcy;&ocy;&pcy;&ucy;&scy;&kcy;&acy; &ocy;&bcy;&scy;&ucy;&zhcy;&dcy;&acy;&iecy;&tcy;&scy;&yacy;</span></h3> <p><span data-i18n="86e3f1ae4a7370fb5faad8f634bb0402076bb73eaf6443f6f10e5d50b2da6891/f9" data-source="After step 7) (in the skip algorithm), we could check if the second commit has been skipped and return it if it is not the case. And in fact that was the algorithm we used from when &amp;quot;git bisect skip&amp;quot; was developed in Git version 1.5.4 (released on February 1st 2008) until Git version 1.6.4 (released July 29th 2009)." onmousemove="i18n(this)">&Pcy;&ocy;&scy;&lcy;&iecy; &shcy;&acy;&gcy;&acy; 7) (&vcy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&iecy; &pcy;&rcy;&ocy;&pcy;&ucy;&scy;&kcy;&acy;) &mcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&mcy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&icy;&tcy;&softcy;, &bcy;&ycy;&lcy; &lcy;&icy; &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy; &vcy;&tcy;&ocy;&rcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &icy; &vcy;&iecy;&rcy;&ncy;&ucy;&tcy;&softcy; &iecy;&gcy;&ocy;, &iecy;&scy;&lcy;&icy; &ecy;&tcy;&ocy; &ncy;&iecy; &tcy;&acy;&kcy;. &Fcy;&acy;&kcy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;, &icy;&mcy;&iecy;&ncy;&ncy;&ocy; &ecy;&tcy;&ocy;&tcy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy; &mcy;&ycy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&lcy;&icy; &scy; &mcy;&ocy;&mcy;&iecy;&ncy;&tcy;&acy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&icy;  &quot;git bisect skip&quot;  &vcy;  Git  &vcy;&iecy;&rcy;&scy;&icy;&icy; 1.5.4 (&vcy;&ycy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ncy;&ocy;&jcy; 1 &fcy;&iecy;&vcy;&rcy;&acy;&lcy;&yacy; 2008 &gcy;.) &dcy;&ocy;  Git  &vcy;&iecy;&rcy;&scy;&icy;&icy; 1.6.4 (&vcy;&ycy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ncy;&ocy;&jcy; 29 &icy;&yucy;&lcy;&yacy; 2009 &gcy;.).</span></p> <p><span data-i18n="e9ec74bb29045d02ee3643bea14dcdd85ae108adab22c5965e149f2c4ad57b57/69" data-source="But Ingo Molnar and H. Peter Anvin (another well known linux kernel developer) both complained that sometimes the best bisection points all happened to be in an area where all the commits are untestable. And in this case the user was asked to test many untestable commits, which could be very inefficient." onmousemove="i18n(this)">&Ncy;&ocy; &Icy;&ncy;&gcy;&ocy; &Mcy;&ocy;&lcy;&ncy;&acy;&rcy; &icy; &KHcy;. &Pcy;&icy;&tcy;&iecy;&rcy; &Acy;&ncy;&vcy;&icy;&ncy; (&iecy;&shchcy;&iecy; &ocy;&dcy;&icy;&ncy; &icy;&zcy;&vcy;&iecy;&scy;&tcy;&ncy;&ycy;&jcy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy; &yacy;&dcy;&rcy;&acy; Linux) &zhcy;&acy;&lcy;&ocy;&vcy;&acy;&lcy;&icy;&scy;&softcy;, &chcy;&tcy;&ocy; &icy;&ncy;&ocy;&gcy;&dcy;&acy; &lcy;&ucy;&chcy;&shcy;&icy;&iecy; &tcy;&ocy;&chcy;&kcy;&icy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &ocy;&kcy;&acy;&zcy;&ycy;&vcy;&acy;&lcy;&icy;&scy;&softcy; &vcy; &ocy;&bcy;&lcy;&acy;&scy;&tcy;&icy;, &gcy;&dcy;&iecy; &vcy;&scy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &ncy;&iecy;&vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&icy;&tcy;&softcy;. &Icy; &vcy; &ecy;&tcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yucy; &pcy;&rcy;&iecy;&dcy;&lcy;&acy;&gcy;&acy;&lcy;&ocy;&scy;&softcy; &pcy;&rcy;&ocy;&tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &mcy;&ncy;&ocy;&zhcy;&iecy;&scy;&tcy;&vcy;&ocy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;, &chcy;&tcy;&ocy; &mcy;&ocy;&gcy;&lcy;&ocy; &bcy;&ycy;&tcy;&softcy; &ocy;&chcy;&iecy;&ncy;&softcy; &ncy;&iecy;&ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&ocy;.</span></p> <p><span data-i18n="13d840b1524f8921a8ca864f1beaa1765168dfc737da0dfd56004e11043aa68c/8b" data-source="Indeed untestable commits are often untestable because a breakage was introduced at one time, and that breakage was fixed only after many other commits were introduced." onmousemove="i18n(this)">&Dcy;&iecy;&jcy;&scy;&tcy;&vcy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy;, &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &chcy;&acy;&scy;&tcy;&ocy; &ncy;&iecy; &pcy;&ocy;&dcy;&dcy;&acy;&yucy;&tcy;&scy;&yacy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&yucy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &ncy;&iecy;&icy;&scy;&pcy;&rcy;&acy;&vcy;&ncy;&ocy;&scy;&tcy;&softcy; &bcy;&ycy;&lcy;&acy; &vcy;&ncy;&iecy;&scy;&iecy;&ncy;&acy; &ocy;&dcy;&ncy;&ocy;&vcy;&rcy;&iecy;&mcy;&iecy;&ncy;&ncy;&ocy;, &icy; &ecy;&tcy;&acy; &ncy;&iecy;&icy;&scy;&pcy;&rcy;&acy;&vcy;&ncy;&ocy;&scy;&tcy;&softcy; &bcy;&ycy;&lcy;&acy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&acy; &ZeroWidthSpace;&ZeroWidthSpace;&tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &pcy;&ocy;&scy;&lcy;&iecy; &tcy;&ocy;&gcy;&ocy;, &kcy;&acy;&kcy; &bcy;&ycy;&lcy;&ocy; &vcy;&ncy;&iecy;&scy;&iecy;&ncy;&ocy; &mcy;&ncy;&ocy;&zhcy;&iecy;&scy;&tcy;&vcy;&ocy; &dcy;&rcy;&ucy;&gcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;.</span></p> <p><span data-i18n="917e74a63058ee2b623fac00cb82e41cfce7dca465986d94121ed3d95eb11018/6a" data-source="This breakage is of course most of the time unrelated to the breakage we are trying to locate in the commit graph. But it prevents us to know if the interesting &amp;quot;bad behavior&amp;quot; is present or not." onmousemove="i18n(this)">&Ecy;&tcy;&acy; &pcy;&ocy;&lcy;&ocy;&mcy;&kcy;&acy;, &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;, &vcy; &bcy;&ocy;&lcy;&softcy;&shcy;&icy;&ncy;&scy;&tcy;&vcy;&iecy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;&vcy; &ncy;&iecy; &scy;&vcy;&yacy;&zcy;&acy;&ncy;&acy; &scy; &pcy;&ocy;&lcy;&ocy;&mcy;&kcy;&ocy;&jcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ucy;&yucy; &mcy;&ycy; &pcy;&ycy;&tcy;&acy;&iecy;&mcy;&scy;&yacy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&icy;&tcy;&softcy; &vcy; &gcy;&rcy;&acy;&fcy;&iecy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&icy;. &Ncy;&ocy; &ecy;&tcy;&ocy; &mcy;&iecy;&shcy;&acy;&iecy;&tcy; &ncy;&acy;&mcy; &ucy;&zcy;&ncy;&acy;&tcy;&softcy;, &pcy;&rcy;&icy;&scy;&ucy;&tcy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy; &lcy;&icy; &icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ncy;&ycy;&jcy;  &quot;bad behavior&quot;  &icy;&lcy;&icy; &ncy;&iecy;&tcy;.</span></p> <p><span data-i18n="95fc6f8633ba9eecb7ead3ec0e2dab5283f404977f0406a57c59e6b27f3c7070/a6" data-source="So it is a fact that commits near an untestable commit have a high probability of being untestable themselves. And the best bisection commits are often found together too (due to the bisection algorithm)." onmousemove="i18n(this)">&Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &fcy;&acy;&kcy;&tcy;&ocy;&mcy; &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &tcy;&ocy;, &chcy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &ncy;&acy;&khcy;&ocy;&dcy;&yacy;&shchcy;&icy;&iecy;&scy;&yacy; &rcy;&yacy;&dcy;&ocy;&mcy; &scy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&mcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&mcy;&icy;, &scy;&acy;&mcy;&icy; &scy; &vcy;&ycy;&scy;&ocy;&kcy;&ocy;&jcy; &vcy;&iecy;&rcy;&ocy;&yacy;&tcy;&ncy;&ocy;&scy;&tcy;&softcy;&yucy; &ocy;&kcy;&acy;&zhcy;&ucy;&tcy;&scy;&yacy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&mcy;&icy;. &Icy; &lcy;&ucy;&chcy;&shcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &tcy;&ocy;&zhcy;&iecy; &chcy;&acy;&scy;&tcy;&ocy; &vcy;&scy;&tcy;&rcy;&iecy;&chcy;&acy;&yucy;&tcy;&scy;&yacy; &vcy;&mcy;&iecy;&scy;&tcy;&iecy; (&bcy;&lcy;&acy;&gcy;&ocy;&dcy;&acy;&rcy;&yacy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&ucy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;).</span></p> <p><span data-i18n="40ccda31c27ce0f21b079f10cb62680ae5429f442b150eb103c08ec39471ad35/e4" data-source="This is why it is a bad idea to just chose the next best unskipped bisection commit when the first one has been skipped." onmousemove="i18n(this)">&Vcy;&ocy;&tcy; &pcy;&ocy;&chcy;&iecy;&mcy;&ucy; &ecy;&tcy;&ocy; &pcy;&lcy;&ocy;&khcy;&acy;&yacy; &icy;&dcy;&iecy;&yacy; &mdash; &pcy;&rcy;&ocy;&scy;&tcy;&ocy; &vcy;&ycy;&bcy;&icy;&rcy;&acy;&tcy;&softcy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&icy;&jcy; &lcy;&ucy;&chcy;&shcy;&icy;&jcy; &ncy;&iecy;&pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ncy;&ycy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &kcy;&ocy;&gcy;&dcy;&acy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &bcy;&ycy;&lcy; &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;.</span></p> <p><span data-i18n="af2355fb1dee73fe11c4faecdeab57541dffe8acaf81416cc613e5310e053194/09" data-source="We found that most commits on the graph may give quite a lot of information when they are tested. And the commits that will not on average give a lot of information are the one near the good and bad commits." onmousemove="i18n(this)">&Mcy;&ycy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&icy;&lcy;&icy;, &chcy;&tcy;&ocy; &bcy;&ocy;&lcy;&softcy;&shcy;&icy;&ncy;&scy;&tcy;&vcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &ncy;&acy; &gcy;&rcy;&acy;&fcy;&icy;&kcy;&iecy; &pcy;&rcy;&icy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &dcy;&acy;&tcy;&softcy; &dcy;&ocy;&vcy;&ocy;&lcy;&softcy;&ncy;&ocy; &mcy;&ncy;&ocy;&gcy;&ocy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy;. &Icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &vcy; &scy;&rcy;&iecy;&dcy;&ncy;&iecy;&mcy; &ncy;&iecy; &dcy;&acy;&yucy;&tcy; &mcy;&ncy;&ocy;&gcy;&ocy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy;, &ncy;&acy;&khcy;&ocy;&dcy;&yacy;&tcy;&scy;&yacy; &rcy;&yacy;&dcy;&ocy;&mcy; &scy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&mcy;&icy; &icy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&mcy;&icy;.</span></p> <p><span data-i18n="dbd60aa8d6ea555e389c4025cb9182c61023486ec1666ce96cbee1e8d97229b5/ca" data-source="So using a PRNG with a bias to favor commits away from the good and bad commits looked like a good choice." onmousemove="i18n(this)">&Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; &Gcy;&Pcy;&Scy;&CHcy; &scy; &ucy;&kcy;&lcy;&ocy;&ncy;&ocy;&mcy; &vcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ucy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &vcy;&mcy;&iecy;&scy;&tcy;&ocy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&khcy; &icy; &pcy;&lcy;&ocy;&khcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &vcy;&ycy;&gcy;&lcy;&yacy;&dcy;&iecy;&lcy;&ocy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&mcy; &vcy;&ycy;&bcy;&ocy;&rcy;&ocy;&mcy;.</span></p> <p><span data-i18n="b56249e827033fe02d0c15943f2e9627ab1a0bc064474df31be1d5f28faff9d1/06" data-source="One obvious improvement to this algorithm would be to look for a commit that has an associated value near the one of the best bisection commit, and that is on another branch, before using the PRNG. Because if such a commit exists, then it is not very likely to be untestable too, so it will probably give more information than a nearly randomly chosen one." onmousemove="i18n(this)">&Ocy;&dcy;&ncy;&icy;&mcy; &icy;&zcy; &ocy;&chcy;&iecy;&vcy;&icy;&dcy;&ncy;&ycy;&khcy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&jcy; &ecy;&tcy;&ocy;&gcy;&ocy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&acy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &pcy;&ocy;&icy;&scy;&kcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &icy;&mcy;&iecy;&iecy;&tcy; &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ncy;&ocy;&iecy; &zcy;&ncy;&acy;&chcy;&iecy;&ncy;&icy;&iecy; &rcy;&yacy;&dcy;&ocy;&mcy; &scy; &ocy;&dcy;&ncy;&icy;&mcy; &icy;&zcy; &lcy;&ucy;&chcy;&shcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &icy; &ncy;&acy;&khcy;&ocy;&dcy;&icy;&tcy;&scy;&yacy; &vcy; &dcy;&rcy;&ucy;&gcy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&iecy;, &pcy;&rcy;&iecy;&zhcy;&dcy;&iecy; &chcy;&iecy;&mcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; PRNG. &Pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy;, &iecy;&scy;&lcy;&icy; &tcy;&acy;&kcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy;, &tcy;&ocy; &ocy;&ncy; &vcy;&rcy;&yacy;&dcy; &lcy;&icy; &ocy;&kcy;&acy;&zhcy;&iecy;&tcy;&scy;&yacy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&mcy;, &pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &ocy;&ncy;, &vcy;&iecy;&rcy;&ocy;&yacy;&tcy;&ncy;&ocy;, &dcy;&acy;&scy;&tcy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy;, &chcy;&iecy;&mcy; &pcy;&ocy;&chcy;&tcy;&icy; &scy;&lcy;&ucy;&chcy;&acy;&jcy;&ncy;&ocy; &vcy;&ycy;&bcy;&rcy;&acy;&ncy;&ncy;&ycy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_checking_merge_bases"><span data-i18n="adaeaa2325ec24f261eb73e00c05a3425ab29cff489743c696af4960ef008f68/0d" data-source="Checking merge bases" onmousemove="i18n(this)">&Pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&kcy;&acy; &bcy;&acy;&zcy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy;</span></h3> <p><span data-i18n="bc048fc203cfcac07a550cad2ab58cd0d16361f06c3afc4c8d6b284b92b6ea9c/44" data-source="There is another tweak in the bisection algorithm that has not been described in the &amp;quot;bisection algorithm&amp;quot; above." onmousemove="i18n(this)">&Vcy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&iecy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &iecy;&scy;&tcy;&softcy; &iecy;&shchcy;&iecy; &ocy;&dcy;&ncy;&acy; &ncy;&acy;&scy;&tcy;&rcy;&ocy;&jcy;&kcy;&acy;, &kcy;&ocy;&tcy;&ocy;&rcy;&acy;&yacy; &ncy;&iecy; &bcy;&ycy;&lcy;&acy; &ocy;&pcy;&icy;&scy;&acy;&ncy;&acy; &vcy;&ycy;&shcy;&iecy; &vcy;  &quot;bisection algorithm&quot; .</span></p> <p><span data-i18n="da31235f3c8d839097b9b76a15b7be5799a441cc45e3582bf71a7e1ca6fbf0c0/7c" data-source="We supposed in the previous examples that the &amp;quot;good&amp;quot; commits were ancestors of the &amp;quot;bad&amp;quot; commit. But this is not a requirement of &amp;quot;git bisect&amp;quot;." onmousemove="i18n(this)">&Vcy; &pcy;&rcy;&iecy;&dcy;&ycy;&dcy;&ucy;&shchcy;&icy;&khcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&acy;&khcy; &mcy;&ycy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&lcy;&icy;, &chcy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;  &quot;good&quot;  &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&rcy;&iecy;&dcy;&kcy;&acy;&mcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot; . &Ncy;&ocy; &ecy;&tcy;&ocy; &ncy;&iecy; &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &tcy;&rcy;&iecy;&bcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy;&mcy;  &quot;git bisect&quot; .</span></p> <p><span data-i18n="4eea3b5ec80cbfdf14062b1e16bd670efc9755f620c727d16f0126c1fec3fe27/a1" data-source="Of course the &amp;quot;bad&amp;quot; commit cannot be an ancestor of a &amp;quot;good&amp;quot; commit, because the ancestors of the good commits are supposed to be &amp;quot;good&amp;quot;. And all the &amp;quot;good&amp;quot; commits must be related to the bad commit. They cannot be on a branch that has no link with the branch of the &amp;quot;bad&amp;quot; commit. But it is possible for a good commit to be related to a bad commit and yet not be neither one of its ancestor nor one of its descendants." onmousemove="i18n(this)">&Kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;, &kcy;&ocy;&mcy;&mcy;&icy;&tcy;  &quot;bad&quot;  &ncy;&iecy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;good&quot; , &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &pcy;&rcy;&iecy;&dcy;&kcy;&acy;&mcy;&icy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &dcy;&ocy;&lcy;&zhcy;&ncy;&ycy; &bcy;&ycy;&tcy;&softcy;  &quot;good&quot; . &Icy; &vcy;&scy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;  &quot;good&quot;  &dcy;&ocy;&lcy;&zhcy;&ncy;&ycy; &bcy;&ycy;&tcy;&softcy; &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ycy; &scy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy;. &Ocy;&ncy;&icy; &ncy;&iecy; &mcy;&ocy;&gcy;&ucy;&tcy; &ncy;&acy;&khcy;&ocy;&dcy;&icy;&tcy;&softcy;&scy;&yacy; &vcy; &vcy;&iecy;&tcy;&kcy;&iecy;, &ncy;&iecy; &icy;&mcy;&iecy;&yucy;&shchcy;&iecy;&jcy; &scy;&vcy;&yacy;&zcy;&icy; &scy; &vcy;&iecy;&tcy;&kcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;  &quot;bad&quot; . &Ncy;&ocy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &scy;&vcy;&yacy;&zcy;&acy;&ncy; &scy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy;, &ncy;&ocy; &pcy;&rcy;&icy; &ecy;&tcy;&ocy;&mcy; &ncy;&iecy; &bcy;&ycy;&tcy;&softcy; &ncy;&icy; &ocy;&dcy;&ncy;&icy;&mcy; &icy;&zcy; &iecy;&gcy;&ocy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&vcy;, &ncy;&icy; &ocy;&dcy;&ncy;&icy;&mcy; &icy;&zcy; &iecy;&gcy;&ocy; &pcy;&ocy;&tcy;&ocy;&mcy;&kcy;&ocy;&vcy;.</span></p> <p><span data-i18n="594e76b240fceb1c8c06833c9d5fdccb383aeaa8853f14d007230b54b6243cc1/0f" data-source="For example, there can be a &amp;quot;main&amp;quot; branch, and a &amp;quot;dev&amp;quot; branch that was forked of the main branch at a commit named &amp;quot;D&amp;quot; like this:" onmousemove="i18n(this)">&Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &mcy;&ocy;&zhcy;&iecy;&tcy; &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ocy;&vcy;&acy;&tcy;&softcy; &vcy;&iecy;&tcy;&kcy;&acy;  &quot;main&quot;  &icy; &vcy;&iecy;&tcy;&kcy;&acy;  &quot;dev&quot; , &kcy;&ocy;&tcy;&ocy;&rcy;&acy;&yacy; &bcy;&ycy;&lcy;&acy; &ocy;&tcy;&vcy;&iecy;&tcy;&vcy;&lcy;&iecy;&ncy;&acy; &ZeroWidthSpace;&ZeroWidthSpace;&ocy;&tcy; &ocy;&scy;&ncy;&ocy;&vcy;&ncy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&icy; &pcy;&rcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&iecy; &scy; &icy;&mcy;&iecy;&ncy;&iecy;&mcy;  &quot;D&quot; , &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;:</span></p> <div> <div> <pre class="hljs language-css"><span class="hljs-selector-tag">A</span>-<span class="hljs-selector-tag">B</span>-C-D-E-F-G  &lt;<span class="hljs-attr">--main</span>
       \
        H-<span class="hljs-selector-tag">I</span>-J  &lt;<span class="hljs-attr">--dev</span></pre> </div> </div> <p><span data-i18n="8e97b2a2a91351a724d82330552fad57866d8fb1d4b90be743a503ed8c934526/f4" data-source="The commit &amp;quot;D&amp;quot; is called a &amp;quot;merge base&amp;quot; for branch &amp;quot;main&amp;quot; and &amp;quot;dev&amp;quot; because it&amp;rsquo;s the best common ancestor for these branches for a merge." onmousemove="i18n(this)">&Kcy;&ocy;&mcy;&mcy;&icy;&tcy;  &quot;D&quot;  &ncy;&acy;&zcy;&ycy;&vcy;&acy;&iecy;&tcy;&scy;&yacy;  &quot;merge base&quot;  &dcy;&lcy;&yacy; &vcy;&iecy;&tcy;&vcy;&iecy;&jcy;  &quot;main&quot;  &icy;  &quot;dev&quot; , &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ocy;&ncy; &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &lcy;&ucy;&chcy;&shcy;&icy;&mcy; &ocy;&bcy;&shchcy;&icy;&mcy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&mcy; &dcy;&lcy;&yacy; &ecy;&tcy;&icy;&khcy; &vcy;&iecy;&tcy;&vcy;&iecy;&jcy; &pcy;&rcy;&icy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&icy;.</span></p> <p><span data-i18n="8c68a8111c03f1fe4d4998071946efd967798708041c07419501a7377d1f823a/39" data-source="Now let&amp;rsquo;s suppose that commit J is bad and commit G is good and that we apply the bisection algorithm like it has been previously described." onmousemove="i18n(this)">&Tcy;&iecy;&pcy;&iecy;&rcy;&softcy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&ocy;&zhcy;&icy;&mcy;, &chcy;&tcy;&ocy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yacy; J &pcy;&lcy;&ocy;&khcy;&acy;&yacy;, &acy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yacy; G &khcy;&ocy;&rcy;&ocy;&shcy;&acy;&yacy;, &icy; &chcy;&tcy;&ocy; &mcy;&ycy; &pcy;&rcy;&icy;&mcy;&iecy;&ncy;&yacy;&iecy;&mcy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &kcy;&acy;&kcy; &bcy;&ycy;&lcy;&ocy; &ocy;&pcy;&icy;&scy;&acy;&ncy;&ocy; &rcy;&acy;&ncy;&iecy;&iecy;.</span></p> <p><span data-i18n="fed65d0fea291e11a99390bcc52a80fa89dd781d589825c9a05b5d843192533a/47" data-source="As described in step 1) b) of the bisection algorithm, we remove all the ancestors of the good commits because they are supposed to be good too." onmousemove="i18n(this)">&Kcy;&acy;&kcy; &ocy;&pcy;&icy;&scy;&acy;&ncy;&ocy; &vcy; &shcy;&acy;&gcy;&iecy; 1) &bcy;) &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&acy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &mcy;&ycy; &ucy;&dcy;&acy;&lcy;&yacy;&iecy;&mcy; &vcy;&scy;&iecy;&khcy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&vcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ocy;&ncy;&icy; &tcy;&ocy;&zhcy;&iecy; &dcy;&ocy;&lcy;&zhcy;&ncy;&ycy; &bcy;&ycy;&tcy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&mcy;&icy;.</span></p> <p><span data-i18n="c10821d86f2e875e55b570442c5f82458af666e11696c373a4bbd6659bf6ca2a/d5" data-source="So we would be left with only:" onmousemove="i18n(this)">&Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &ncy;&acy;&mcy; &ocy;&scy;&tcy;&acy;&ncy;&iecy;&tcy;&scy;&yacy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy;:</span></p> <div> <div> <pre class="hljs language-css">H-<span class="hljs-selector-tag">I</span>-J</pre> </div> </div> <p><span data-i18n="76b0b1fc3d90d85402fbf2a755c683dda6551e78ced1218b04816de6845a0b69/d5" data-source="But what happens if the first bad commit is &amp;quot;B&amp;quot; and if it has been fixed in the &amp;quot;main&amp;quot; branch by commit &amp;quot;F&amp;quot;?" onmousemove="i18n(this)">&Ncy;&ocy; &chcy;&tcy;&ocy; &pcy;&rcy;&ocy;&icy;&zcy;&ocy;&jcy;&dcy;&iecy;&tcy;, &iecy;&scy;&lcy;&icy; &pcy;&iecy;&rcy;&vcy;&ycy;&mcy; &ncy;&iecy;&ucy;&dcy;&acy;&chcy;&ncy;&ycy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy; &bcy;&ucy;&dcy;&iecy;&tcy;  &quot;B&quot;  &icy; &iecy;&scy;&lcy;&icy; &ocy;&ncy; &bcy;&ucy;&dcy;&iecy;&tcy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy; &vcy; &vcy;&iecy;&tcy;&kcy;&iecy;  &quot;main&quot;  &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy;  &quot;F&quot; ?</span></p> <p><span data-i18n="968d73d5642e4cd6440f858d28f5f04380a5ac731dd854c6cbc73cc24330cfb5/12" data-source="The result of such a bisection would be that we would find that H is the first bad commit, when in fact it&amp;rsquo;s B. So that would be wrong!" onmousemove="i18n(this)">&Rcy;&iecy;&zcy;&ucy;&lcy;&softcy;&tcy;&acy;&tcy;&ocy;&mcy; &tcy;&acy;&kcy;&ocy;&gcy;&ocy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &bcy;&ucy;&dcy;&iecy;&tcy; &tcy;&ocy;, &chcy;&tcy;&ocy; &mcy;&ycy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&icy;&mcy;, &chcy;&tcy;&ocy; H &mdash; &ecy;&tcy;&ocy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &khcy;&ocy;&tcy;&yacy; &ncy;&acy; &scy;&acy;&mcy;&ocy;&mcy; &dcy;&iecy;&lcy;&iecy; &ecy;&tcy;&ocy; B. &Tcy;&acy;&kcy; &chcy;&tcy;&ocy; &ecy;&tcy;&ocy; &bcy;&ycy;&lcy;&ocy; &bcy;&ycy; &ncy;&iecy;&pcy;&rcy;&acy;&vcy;&icy;&lcy;&softcy;&ncy;&ocy;!</span></p> <p><span data-i18n="a4ceb8f485e86200530d62361282070ab35a611bda39d986dd4fcda016e4413f/24" data-source="And yes it can happen in practice that people working on one branch are not aware that people working on another branch fixed a bug! It could also happen that F fixed more than one bug or that it is a revert of some big development effort that was not ready to be released." onmousemove="i18n(this)">&Icy; &dcy;&acy;, &ncy;&acy; &pcy;&rcy;&acy;&kcy;&tcy;&icy;&kcy;&iecy; &mcy;&ocy;&zhcy;&iecy;&tcy; &scy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy;&scy;&yacy; &tcy;&acy;&kcy;, &chcy;&tcy;&ocy; &lcy;&yucy;&dcy;&icy;, &rcy;&acy;&bcy;&ocy;&tcy;&acy;&yucy;&shchcy;&icy;&iecy; &vcy; &ocy;&dcy;&ncy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&iecy;, &ncy;&iecy; &zcy;&ncy;&acy;&yucy;&tcy;, &chcy;&tcy;&ocy; &lcy;&yucy;&dcy;&icy;, &rcy;&acy;&bcy;&ocy;&tcy;&acy;&yucy;&shchcy;&icy;&iecy; &vcy; &dcy;&rcy;&ucy;&gcy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&iecy;, &icy;&scy;&pcy;&rcy;&acy;&vcy;&icy;&lcy;&icy; &ocy;&shcy;&icy;&bcy;&kcy;&ucy;! &Tcy;&acy;&kcy;&zhcy;&iecy; &mcy;&ocy;&zhcy;&iecy;&tcy; &scy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy;&scy;&yacy; &tcy;&acy;&kcy;, &chcy;&tcy;&ocy; F &icy;&scy;&pcy;&rcy;&acy;&vcy;&icy;&tcy; &bcy;&ocy;&lcy;&iecy;&iecy; &ocy;&dcy;&ncy;&ocy;&jcy; &ocy;&shcy;&icy;&bcy;&kcy;&icy; &icy;&lcy;&icy; &chcy;&tcy;&ocy; &ecy;&tcy;&ocy; &vcy;&ocy;&zcy;&vcy;&rcy;&acy;&tcy; &kcy; &kcy;&acy;&kcy;&ocy;&jcy;-&tcy;&ocy; &bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&jcy; &rcy;&acy;&bcy;&ocy;&tcy;&iecy; &pcy;&ocy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&iecy;, &kcy;&ocy;&tcy;&ocy;&rcy;&acy;&yacy; &ncy;&iecy; &bcy;&ycy;&lcy;&acy; &gcy;&ocy;&tcy;&ocy;&vcy;&acy; &kcy; &vcy;&ycy;&pcy;&ucy;&scy;&kcy;&ucy;.</span></p> <p><span data-i18n="7a3311385d51d05cd6b03ebe4f9ecf741efcea95fb1bd2344a5b8c728d875334/bb" data-source="In fact development teams often maintain both a development branch and a maintenance branch, and it would be quite easy for them if &amp;quot;git bisect&amp;quot; just worked when they want to bisect a regression on the development branch that is not on the maintenance branch. They should be able to start bisecting using:" onmousemove="i18n(this)">&Ncy;&acy; &scy;&acy;&mcy;&ocy;&mcy; &dcy;&iecy;&lcy;&iecy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;&ycy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&ocy;&vcy; &chcy;&acy;&scy;&tcy;&ocy; &pcy;&ocy;&dcy;&dcy;&iecy;&rcy;&zhcy;&icy;&vcy;&acy;&yucy;&tcy; &kcy;&acy;&kcy; &vcy;&iecy;&tcy;&kcy;&ucy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&icy;, &tcy;&acy;&kcy; &icy; &vcy;&iecy;&tcy;&kcy;&ucy; &ocy;&bcy;&scy;&lcy;&ucy;&zhcy;&icy;&vcy;&acy;&ncy;&icy;&yacy;, &icy; &dcy;&lcy;&yacy; &ncy;&icy;&khcy; &bcy;&ycy;&lcy;&ocy; &bcy;&ycy; &dcy;&ocy;&vcy;&ocy;&lcy;&softcy;&ncy;&ocy; &lcy;&iecy;&gcy;&kcy;&ocy;, &iecy;&scy;&lcy;&icy; &bcy;&ycy;  &quot;git bisect&quot;  &pcy;&rcy;&ocy;&scy;&tcy;&ocy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&lcy;, &kcy;&ocy;&gcy;&dcy;&acy; &ocy;&ncy;&icy; &khcy;&ocy;&tcy;&yacy;&tcy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&icy;&tcy;&softcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yucy; &vcy; &vcy;&iecy;&tcy;&kcy;&iecy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&icy;, &kcy;&ocy;&tcy;&ocy;&rcy;&acy;&yacy; &ncy;&iecy; &ncy;&acy;&khcy;&ocy;&dcy;&icy;&tcy;&scy;&yacy; &vcy; &vcy;&iecy;&tcy;&kcy;&iecy; &ocy;&bcy;&scy;&lcy;&ucy;&zhcy;&icy;&vcy;&acy;&ncy;&icy;&yacy;. &Ocy;&ncy;&icy; &dcy;&ocy;&lcy;&zhcy;&ncy;&ycy; &bcy;&ycy;&tcy;&softcy; &vcy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&icy; &ncy;&acy;&chcy;&acy;&tcy;&softcy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yacy;:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git bisect start dev main</pre> </div> </div> <p><span data-i18n="bc51a13a6a850ee576fe6a629679186b8925e6cd06ae3ffe154ca87362229422/5d" data-source="To enable that additional nice feature, when a bisection is started and when some good commits are not ancestors of the bad commit, we first compute the merge bases between the bad and the good commits and we chose these merge bases as the first commits that will be checked out and tested." onmousemove="i18n(this)">&CHcy;&tcy;&ocy;&bcy;&ycy; &vcy;&kcy;&lcy;&yucy;&chcy;&icy;&tcy;&softcy; &ecy;&tcy;&ucy; &dcy;&ocy;&pcy;&ocy;&lcy;&ncy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ucy;&yucy; &pcy;&rcy;&icy;&yacy;&tcy;&ncy;&ucy;&yucy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&yucy;, &kcy;&ocy;&gcy;&dcy;&acy; &zcy;&acy;&pcy;&ucy;&scy;&kcy;&acy;&iecy;&tcy;&scy;&yacy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &icy; &kcy;&ocy;&gcy;&dcy;&acy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &ncy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &pcy;&rcy;&iecy;&dcy;&kcy;&acy;&mcy;&icy; &pcy;&lcy;&ocy;&khcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;, &mcy;&ycy; &scy;&ncy;&acy;&chcy;&acy;&lcy;&acy; &vcy;&ycy;&chcy;&icy;&scy;&lcy;&yacy;&iecy;&mcy; &bcy;&acy;&zcy;&ycy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &mcy;&iecy;&zhcy;&dcy;&ucy; &pcy;&lcy;&ocy;&khcy;&icy;&mcy;&icy; &icy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&mcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&mcy;&icy; &icy; &vcy;&ycy;&bcy;&icy;&rcy;&acy;&iecy;&mcy; &ecy;&tcy;&icy; &bcy;&acy;&zcy;&ycy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &vcy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&iecy; &pcy;&iecy;&rcy;&vcy;&ycy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &bcy;&ucy;&dcy;&ucy;&tcy; &bcy;&ycy;&tcy;&softcy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&iecy;&ncy;&ycy; &icy; &pcy;&rcy;&ocy;&tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&ycy;.</span></p> <p><span data-i18n="28f4eb3eac54b97edaf3261fd95be38d03e048861e5c64715bbcd74fa22acd0e/b9" data-source="If it happens that one merge base is bad, then the bisection process is stopped with a message like:" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;&tcy;&scy;&yacy;, &chcy;&tcy;&ocy; &ocy;&dcy;&ncy;&acy; &bcy;&acy;&zcy;&acy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &ncy;&iecy;&icy;&scy;&pcy;&rcy;&acy;&vcy;&ncy;&acy;, &tcy;&ocy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &ocy;&scy;&tcy;&acy;&ncy;&acy;&vcy;&lcy;&icy;&vcy;&acy;&iecy;&tcy;&scy;&yacy; &scy; &scy;&ocy;&ocy;&bcy;&shchcy;&iecy;&ncy;&icy;&iecy;&mcy; &tcy;&icy;&pcy;&acy;:</span></p> <div> <div> <pre class="hljs language-csharp">The merge <span class="hljs-keyword">base</span> BBBBBB <span class="hljs-keyword">is</span> bad.
This means the bug has been <span class="hljs-keyword">fixed</span> between BBBBBB <span class="hljs-keyword">and</span> [GGGGGG,...].</pre> </div> </div> <p><span data-i18n="7d9088378c932c6c83e781a1da551adbe4d269eea8930ff3764bd5fc9c261f5e/55" data-source="where BBBBBB is the sha1 hash of the bad merge base and [GGGGGG,&amp;hellip;&amp;ZeroWidthSpace;] is a comma separated list of the sha1 of the good commits." onmousemove="i18n(this)">&gcy;&dcy;&iecy; BBBBBB &mdash; &ecy;&tcy;&ocy; &khcy;&ecy;&shcy; sha1 &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &bcy;&acy;&zcy;&ycy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy;, &acy; [GGGGGG,&hellip;] &mdash; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&ncy;&ycy;&jcy; &zcy;&acy;&pcy;&yacy;&tcy;&ycy;&mcy;&icy; &scy;&pcy;&icy;&scy;&ocy;&kcy; sha1 &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;.</span></p> <p><span data-i18n="876ee6378cb4d72ab60beb3d4e328da61cf1ea13b523b20f6d1a7fb7aaab5532/b7" data-source="If some of the merge bases are skipped, then the bisection process continues, but the following message is printed for each skipped merge base:" onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &icy;&zcy; &bcy;&acy;&zcy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ycy;, &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &pcy;&rcy;&ocy;&dcy;&ocy;&lcy;&zhcy;&acy;&iecy;&tcy;&scy;&yacy;, &ncy;&ocy; &dcy;&lcy;&yacy; &kcy;&acy;&zhcy;&dcy;&ocy;&jcy; &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ncy;&ocy;&jcy; &bcy;&acy;&zcy;&ycy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &pcy;&iecy;&chcy;&acy;&tcy;&acy;&iecy;&tcy;&scy;&yacy; &scy;&lcy;&iecy;&dcy;&ucy;&yucy;&shchcy;&iecy;&iecy; &scy;&ocy;&ocy;&bcy;&shchcy;&iecy;&ncy;&icy;&iecy;:</span></p> <div> <div> <pre class="hljs language-sql">Warning: the <span class="hljs-keyword">merge</span> base <span class="hljs-keyword">between</span> BBBBBB <span class="hljs-keyword">and</span> [GGGGGG,...] must be skipped.
So we cannot be sure the <span class="hljs-keyword">first</span> bad <span class="hljs-keyword">commit</span> <span class="hljs-keyword">is</span> <span class="hljs-keyword">between</span> MMMMMM <span class="hljs-keyword">and</span> BBBBBB.
We continue anyway.</pre> </div> </div> <p><span data-i18n="c2f79d893a10e8c84c25e90e98dab59d9cf6ae7a3320ff655122bb2021d3d085/a4" data-source="where BBBBBB is the sha1 hash of the bad commit, MMMMMM is the sha1 hash of the merge base that is skipped and [GGGGGG,&amp;hellip;&amp;ZeroWidthSpace;] is a comma separated list of the sha1 of the good commits." onmousemove="i18n(this)">&gcy;&dcy;&iecy; BBBBBB &mdash; &ecy;&tcy;&ocy; &khcy;&iecy;&shcy; sha1 &pcy;&lcy;&ocy;&khcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;, MMMMMM &mdash; &ecy;&tcy;&ocy; &khcy;&ecy;&shcy; sha1 &pcy;&rcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ncy;&ocy;&jcy; &bcy;&acy;&zcy;&ycy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy;, &acy; [GGGGGG,&hellip;&ZeroWidthSpace;] &mdash; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&ncy;&ycy;&jcy; &zcy;&acy;&pcy;&yacy;&tcy;&ycy;&mcy;&icy; &scy;&pcy;&icy;&scy;&ocy;&kcy; sha1 &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&khcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;.</span></p> <p><span data-i18n="ac1bf853a515ea16e3edf744ae9da92136a4261e065d3287bf257a77e0fd6ed2/2d" data-source="So if there is no bad merge base, the bisection process continues as usual after this step." onmousemove="i18n(this)">&Pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy;, &iecy;&scy;&lcy;&icy; &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &bcy;&acy;&zcy;&ycy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &ncy;&iecy;&tcy;, &pcy;&ocy;&scy;&lcy;&iecy; &ecy;&tcy;&ocy;&gcy;&ocy; &shcy;&acy;&gcy;&acy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &pcy;&rcy;&ocy;&dcy;&ocy;&lcy;&zhcy;&acy;&iecy;&tcy;&scy;&yacy; &kcy;&acy;&kcy; &ocy;&bcy;&ycy;&chcy;&ncy;&ocy;.</span></p> </div> </div> <h2 class="text-body-emphasis"  id="_best_bisecting_practices"><span data-i18n="8e35e104a25b86927772aeae61d3d214be277e457224c841b2f4ed7724a973d9/27" data-source="Best bisecting practices" onmousemove="i18n(this)">&Lcy;&ucy;&chcy;&shcy;&icy;&iecy; &pcy;&rcy;&acy;&kcy;&tcy;&icy;&kcy;&icy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;</span></h2> <div> <div> <h3 class="text-body-emphasis"  id="_using_test_suites_and_git_bisect_together"><span data-i18n="a0d1719e0b9598519067874e3a8e20bea993a698d7d333390ab85ac363d6c8e8/35" data-source="Using test suites and git bisect together" onmousemove="i18n(this)">&Scy;&ocy;&vcy;&mcy;&iecy;&scy;&tcy;&ncy;&ocy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&khcy; &ncy;&acy;&bcy;&ocy;&rcy;&ocy;&vcy; &icy;  git  &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;</span></h3> <p><span data-i18n="7fc6f30e7a001b0f1743418bfe4a1e6ae1818ec2e5591a45d2cc27e292c74052/ff" data-source="If you both have a test suite and use git bisect, then it becomes less important to check that all tests pass after each commit. Though of course it is probably a good idea to have some checks to avoid breaking too many things because it could make bisecting other bugs more difficult." onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &ucy; &vcy;&acy;&scy; &ocy;&bcy;&ocy;&icy;&khcy; &iecy;&scy;&tcy;&softcy; &ncy;&acy;&bcy;&ocy;&rcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &icy; &vcy;&ycy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy;&iecy;  git  bisect, &tcy;&ocy;&gcy;&dcy;&acy; &scy;&tcy;&acy;&ncy;&ocy;&vcy;&icy;&tcy;&scy;&yacy; &mcy;&iecy;&ncy;&iecy;&iecy; &vcy;&acy;&zhcy;&ncy;&ocy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&tcy;&softcy;, &pcy;&rcy;&ocy;&khcy;&ocy;&dcy;&yacy;&tcy; &lcy;&icy; &vcy;&scy;&iecy; &tcy;&iecy;&scy;&tcy;&ycy; &pcy;&ocy;&scy;&lcy;&iecy; &kcy;&acy;&zhcy;&dcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;. &KHcy;&ocy;&tcy;&yacy;, &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;, &vcy;&iecy;&rcy;&ocy;&yacy;&tcy;&ncy;&ocy;, &bcy;&ycy;&lcy;&ocy; &bcy;&ycy; &ncy;&iecy;&pcy;&lcy;&ocy;&khcy;&ocy; &pcy;&rcy;&ocy;&vcy;&iecy;&scy;&tcy;&icy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&kcy;&icy;, &chcy;&tcy;&ocy;&bcy;&ycy; &ncy;&iecy; &scy;&lcy;&ocy;&mcy;&acy;&tcy;&softcy; &scy;&lcy;&icy;&shcy;&kcy;&ocy;&mcy; &mcy;&ncy;&ocy;&gcy;&ocy; &vcy;&iecy;&shchcy;&iecy;&jcy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ecy;&tcy;&ocy; &mcy;&ocy;&zhcy;&iecy;&tcy; &zcy;&acy;&tcy;&rcy;&ucy;&dcy;&ncy;&icy;&tcy;&softcy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &dcy;&rcy;&ucy;&gcy;&icy;&khcy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;.</span></p> <p><span data-i18n="4e245a46fe63a9c0811aa71c34dd3d40a64505244a29bfea1409cad9e05de198/e7" data-source="You can focus your efforts to check at a few points (for example rc and beta releases) that all the T test cases pass for all the N configurations. And when some tests don&amp;rsquo;t pass you can use &amp;quot;git bisect&amp;quot; (or better &amp;quot;git bisect run&amp;quot;). So you should perform roughly:" onmousemove="i18n(this)">&Vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &scy;&ocy;&scy;&rcy;&iecy;&dcy;&ocy;&tcy;&ocy;&chcy;&icy;&tcy;&softcy; &scy;&vcy;&ocy;&icy; &ucy;&scy;&icy;&lcy;&icy;&yacy; &ncy;&acy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&kcy;&iecy; &vcy; &ncy;&iecy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&icy;&khcy; &tcy;&ocy;&chcy;&kcy;&acy;&khcy; (&ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, rc- &icy; &bcy;&iecy;&tcy;&acy;-&vcy;&iecy;&rcy;&scy;&icy;&yacy;&khcy;), &chcy;&tcy;&ocy; &vcy;&scy;&iecy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&iecy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&ycy; T &pcy;&rcy;&ocy;&khcy;&ocy;&dcy;&yacy;&tcy; &dcy;&lcy;&yacy; &vcy;&scy;&iecy;&khcy; &kcy;&ocy;&ncy;&fcy;&icy;&gcy;&ucy;&rcy;&acy;&tscy;&icy;&jcy; N. &Acy; &iecy;&scy;&lcy;&icy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &tcy;&iecy;&scy;&tcy;&ycy; &ncy;&iecy; &pcy;&rcy;&ocy;&jcy;&dcy;&iecy;&ncy;&ycy;, &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;  &quot;git bisect&quot;  (&icy;&lcy;&icy; &lcy;&ucy;&chcy;&shcy;&iecy;  &quot;git bisect run&quot; ). &Icy;&tcy;&acy;&kcy;, &vcy;&acy;&mcy; &scy;&lcy;&iecy;&dcy;&ucy;&iecy;&tcy; &vcy;&ycy;&pcy;&ocy;&lcy;&ncy;&icy;&tcy;&softcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&ncy;&ocy;:</span></p> <div> <div> <pre class="hljs language-r"><span class="hljs-built_in">c</span> <span class="hljs-operator">*</span> N <span class="hljs-operator">*</span> <span class="hljs-built_in">T</span> <span class="hljs-operator">+</span> b <span class="hljs-operator">*</span> M <span class="hljs-operator">*</span> log2<span class="hljs-punctuation">(</span>M<span class="hljs-punctuation">)</span> tests</pre> </div> </div> <p><span data-i18n="9225ea43bb259e31c96237b750ee149769769077c32e9998a922956727ede21a/9e" data-source="where c is the number of rounds of test (so a small constant) and b is the ratio of bug per commit (hopefully a small constant too)." onmousemove="i18n(this)">&gcy;&dcy;&iecy; c &mdash; &kcy;&ocy;&lcy;&icy;&chcy;&iecy;&scy;&tcy;&vcy;&ocy; &rcy;&acy;&ucy;&ncy;&dcy;&ocy;&vcy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; (&pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &ncy;&iecy;&bcy;&ocy;&lcy;&softcy;&shcy;&acy;&yacy; &kcy;&ocy;&ncy;&scy;&tcy;&acy;&ncy;&tcy;&acy;), &acy; b &mdash; &scy;&ocy;&ocy;&tcy;&ncy;&ocy;&shcy;&iecy;&ncy;&icy;&iecy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy; &ncy;&acy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&yucy; (&ncy;&acy;&dcy;&iecy;&yucy;&scy;&softcy;, &tcy;&ocy;&zhcy;&iecy; &ncy;&iecy;&bcy;&ocy;&lcy;&softcy;&shcy;&acy;&yacy; &kcy;&ocy;&ncy;&scy;&tcy;&acy;&ncy;&tcy;&acy;).</span></p> <p><span data-i18n="c70d25f250902ccd11b742aecfe95ef5f622b8642e5da0369f437b9964a97516/a2" data-source="So of course it&amp;rsquo;s much better as it&amp;rsquo;s O(N * T) vs O(N * T * M) if you would test everything after each commit." onmousemove="i18n(this)">&Tcy;&acy;&kcy; &chcy;&tcy;&ocy;, &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;, &gcy;&ocy;&rcy;&acy;&zcy;&dcy;&ocy; &lcy;&ucy;&chcy;&shcy;&iecy;, &chcy;&iecy;&mcy; O(N * T) &pcy;&rcy;&ocy;&tcy;&icy;&vcy; O(N * T * M), &iecy;&scy;&lcy;&icy; &vcy;&ycy; &bcy;&ucy;&dcy;&iecy;&tcy;&iecy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&tcy;&softcy; &vcy;&scy;&iecy; &pcy;&ocy;&scy;&lcy;&iecy; &kcy;&acy;&zhcy;&dcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;.</span></p> <p><span data-i18n="ffb9173a22d65c2cd14254db10ba392f090ffcf48336bc204e8a15a7ed1d8800/43" data-source="This means that test suites are good to prevent some bugs from being committed and they are also quite good to tell you that you have some bugs. But they are not so good to tell you where some bugs have been introduced. To tell you that efficiently, git bisect is needed." onmousemove="i18n(this)">&Ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &ncy;&acy;&bcy;&ocy;&rcy;&ycy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy; &dcy;&lcy;&yacy; &pcy;&rcy;&iecy;&dcy;&ocy;&tcy;&vcy;&rcy;&acy;&shchcy;&iecy;&ncy;&icy;&yacy; &vcy;&ocy;&zcy;&ncy;&icy;&kcy;&ncy;&ocy;&vcy;&iecy;&ncy;&icy;&yacy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;, &acy; &tcy;&acy;&kcy;&zhcy;&iecy; &dcy;&lcy;&yacy; &tcy;&ocy;&gcy;&ocy;, &chcy;&tcy;&ocy;&bcy;&ycy; &scy;&ocy;&ocy;&bcy;&shchcy;&icy;&tcy;&softcy; &vcy;&acy;&mcy;, &chcy;&tcy;&ocy; &ucy; &vcy;&acy;&scy; &iecy;&scy;&tcy;&softcy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ocy;&shcy;&icy;&bcy;&kcy;&icy;. &Ncy;&ocy; &ocy;&ncy;&icy; &ncy;&iecy; &ncy;&acy;&scy;&tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;, &chcy;&tcy;&ocy;&bcy;&ycy; &rcy;&acy;&scy;&scy;&kcy;&acy;&zcy;&acy;&tcy;&softcy; &vcy;&acy;&mcy;, &gcy;&dcy;&iecy; &bcy;&ycy;&lcy;&icy; &vcy;&vcy;&iecy;&dcy;&iecy;&ncy;&ycy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ocy;&shcy;&icy;&bcy;&kcy;&icy;. &CHcy;&tcy;&ocy;&bcy;&ycy; &scy;&kcy;&acy;&zcy;&acy;&tcy;&softcy; &vcy;&acy;&mcy; &ecy;&tcy;&ocy; &ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&ocy;, &ncy;&iecy;&ocy;&bcy;&khcy;&ocy;&dcy;&icy;&mcy;&acy; &bcy;&icy;&scy;&scy;&iecy;&kcy;&tcy;&rcy;&icy;&scy;&acy;  git .</span></p> <p><span data-i18n="6768af16692aa5b381248ff903cfbee781c5a984b3b5b209749878a8fb26a8f5/48" data-source="The other nice thing with test suites, is that when you have one, you already know how to test for bad behavior. So you can use this knowledge to create a new test case for &amp;quot;git bisect&amp;quot; when it appears that there is a regression. So it will be easier to bisect the bug and fix it. And then you can add the test case you just created to your test suite." onmousemove="i18n(this)">&IEcy;&shchcy;&iecy; &ocy;&dcy;&ncy;&acy; &pcy;&rcy;&icy;&yacy;&tcy;&ncy;&acy;&yacy; &ocy;&scy;&ocy;&bcy;&iecy;&ncy;&ncy;&ocy;&scy;&tcy;&softcy; &ncy;&acy;&bcy;&ocy;&rcy;&ocy;&vcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &zcy;&acy;&kcy;&lcy;&yucy;&chcy;&acy;&iecy;&tcy;&scy;&yacy; &vcy; &tcy;&ocy;&mcy;, &chcy;&tcy;&ocy; &iecy;&scy;&lcy;&icy; &ocy;&ncy;&icy; &ucy; &vcy;&acy;&scy; &iecy;&scy;&tcy;&softcy;, &vcy;&ycy; &ucy;&zhcy;&iecy; &zcy;&ncy;&acy;&iecy;&tcy;&iecy;, &kcy;&acy;&kcy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&tcy;&softcy; &icy;&khcy; &ncy;&acy; &pcy;&lcy;&ocy;&khcy;&ocy;&iecy; &pcy;&ocy;&vcy;&iecy;&dcy;&iecy;&ncy;&icy;&iecy;. &Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &ecy;&tcy;&icy; &zcy;&ncy;&acy;&ncy;&icy;&yacy; &dcy;&lcy;&yacy; &scy;&ocy;&zcy;&dcy;&acy;&ncy;&icy;&yacy; &ncy;&ocy;&vcy;&ocy;&gcy;&ocy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ocy;&gcy;&ocy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&acy; &dcy;&lcy;&yacy;  &quot;git bisect&quot; , &kcy;&ocy;&gcy;&dcy;&acy; &vcy;&ycy;&yacy;&scy;&ncy;&icy;&tcy;&scy;&yacy;, &chcy;&tcy;&ocy; &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yacy;. &Tcy;&acy;&kcy; &bcy;&ucy;&dcy;&iecy;&tcy; &pcy;&rcy;&ocy;&shchcy;&iecy; &rcy;&acy;&zcy;&rcy;&iecy;&zcy;&acy;&tcy;&softcy; &ocy;&shcy;&icy;&bcy;&kcy;&ucy; &icy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&icy;&tcy;&softcy; &iecy;&iecy;. &Zcy;&acy;&tcy;&iecy;&mcy; &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &dcy;&ocy;&bcy;&acy;&vcy;&icy;&tcy;&softcy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &chcy;&tcy;&ocy; &scy;&ocy;&zcy;&dcy;&acy;&ncy;&ncy;&ycy;&jcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&jcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy; &vcy; &scy;&vcy;&ocy;&jcy; &ncy;&acy;&bcy;&ocy;&rcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;.</span></p> <p><span data-i18n="352a922092c18d8dd6d8a26eec921902771142866ef49592566642b88e06118e/a2" data-source="So if you know how to create test cases and how to bisect, you will be subject to a virtuous circle:" onmousemove="i18n(this)">&Icy;&tcy;&acy;&kcy;, &iecy;&scy;&lcy;&icy; &vcy;&ycy; &zcy;&ncy;&acy;&iecy;&tcy;&iecy;, &kcy;&acy;&kcy; &scy;&ocy;&zcy;&dcy;&acy;&vcy;&acy;&tcy;&softcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&iecy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&ycy; &icy; &kcy;&acy;&kcy; &dcy;&iecy;&lcy;&icy;&tcy;&softcy; &icy;&khcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &vcy;&ycy; &pcy;&ocy;&pcy;&acy;&dcy;&iecy;&tcy;&iecy; &vcy; &kcy;&rcy;&ucy;&gcy; &dcy;&iecy;&jcy;&scy;&tcy;&vcy;&icy;&yacy;:</span></p> <p><span data-i18n="3a799524bade965d495f41f63f5f4dcf232a19c8436b6441e3f87b4cf5c682fd/1b" data-source="more tests &amp;rArr; easier to create tests &amp;rArr; easier to bisect &amp;rArr; more tests" onmousemove="i18n(this)">&bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &rArr; &lcy;&iecy;&gcy;&chcy;&iecy; &scy;&ocy;&zcy;&dcy;&acy;&vcy;&acy;&tcy;&softcy; &tcy;&iecy;&scy;&tcy;&ycy; &rArr; &lcy;&iecy;&gcy;&chcy;&iecy; &dcy;&iecy;&lcy;&icy;&tcy;&softcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &rArr; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;</span></p> <p><span data-i18n="5864665072afe8faecc76e034acd02c91bea917abbf7c7c4866c33074571af50/2c" data-source="So test suites and &amp;quot;git bisect&amp;quot; are complementary tools that are very powerful and efficient when used together." onmousemove="i18n(this)">&Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &ncy;&acy;&bcy;&ocy;&rcy;&ycy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &icy;  &quot;git bisect&quot;  &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &vcy;&zcy;&acy;&icy;&mcy;&ocy;&dcy;&ocy;&pcy;&ocy;&lcy;&ncy;&yacy;&yucy;&shchcy;&icy;&mcy;&icy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy;&acy;&mcy;&icy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &ocy;&chcy;&iecy;&ncy;&softcy; &mcy;&ocy;&shchcy;&ncy;&ycy;&mcy;&icy; &icy; &ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&ycy;&mcy;&icy; &pcy;&rcy;&icy; &scy;&ocy;&vcy;&mcy;&iecy;&scy;&tcy;&ncy;&ocy;&mcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&icy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_bisecting_build_failures"><span data-i18n="d2ed882cdbd60c6dfa93a4348f7ba04691f629326f05404ee60a389e583e02ac/38" data-source="Bisecting build failures" onmousemove="i18n(this)">&Rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy; &scy;&bcy;&ocy;&rcy;&kcy;&icy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;</span></h3> <p><span data-i18n="fabcca825c82fd7a22a0bd56dc534695e59c56caeb0bf692eddb6eadb9608ff0/a8" data-source="You can very easily automatically bisect broken builds using something like:" onmousemove="i18n(this)">&Vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &ocy;&chcy;&iecy;&ncy;&softcy; &lcy;&iecy;&gcy;&kcy;&ocy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&icy;&tcy;&softcy; &scy;&lcy;&ocy;&mcy;&acy;&ncy;&ncy;&ycy;&iecy; &scy;&bcy;&ocy;&rcy;&kcy;&icy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yacy; &chcy;&tcy;&ocy;-&tcy;&ocy; &vcy;&rcy;&ocy;&dcy;&iecy;:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git bisect start <span class="hljs-variable constant_">BAD</span> <span class="hljs-variable constant_">GOOD</span>
<span class="hljs-variable">$ </span>git bisect run make</pre> </div> </div> </div> <div> <h3 class="text-body-emphasis"  id="_passing_sh_c_some_commands_to_git_bisect_run"><span data-i18n="3714b685c4d691eb5d72891f797442abb32ea252ece069df5252959dde20f28b/36" data-source="Passing sh -c &amp;quot;some commands&amp;quot; to &amp;quot;git bisect run&amp;quot;" onmousemove="i18n(this)">&Pcy;&iecy;&rcy;&iecy;&dcy;&acy;&chcy;&acy; sh -c  &quot;some commands&quot;  &vcy;  &quot;git bisect run&quot;</span></h3> <p><span data-i18n="652744a2ab28954bbafd780fd76c15c2bd557594532f907f10ead1989727af95/0f" data-source="For example:" onmousemove="i18n(this)">For example:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git bisect run sh -c <span class="hljs-string">&quot;make || exit 125; ./my_app | grep &apos;good output&apos;&quot;</span></pre> </div> </div> <p><span data-i18n="35b68b41fb70ff74ed19ada4d6caa6d16168b1005ecaf60975a988498d993fa8/65" data-source="On the other hand if you do this often, then it can be worth having scripts to avoid too much typing." onmousemove="i18n(this)">&Scy; &dcy;&rcy;&ucy;&gcy;&ocy;&jcy; &scy;&tcy;&ocy;&rcy;&ocy;&ncy;&ycy;, &iecy;&scy;&lcy;&icy; &vcy;&ycy; &dcy;&iecy;&lcy;&acy;&iecy;&tcy;&iecy; &ecy;&tcy;&ocy; &chcy;&acy;&scy;&tcy;&ocy;, &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy;, &scy;&tcy;&ocy;&icy;&tcy; &icy;&mcy;&iecy;&tcy;&softcy; &scy;&kcy;&rcy;&icy;&pcy;&tcy;&ycy;, &chcy;&tcy;&ocy;&bcy;&ycy; &icy;&zcy;&bcy;&iecy;&zhcy;&acy;&tcy;&softcy; &scy;&lcy;&icy;&shcy;&kcy;&ocy;&mcy; &bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&gcy;&ocy; &ncy;&acy;&bcy;&ocy;&rcy;&acy; &tcy;&iecy;&kcy;&scy;&tcy;&acy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_finding_performance_regressions"><span data-i18n="4aff643e5e9e1ae1e90c6fd87b2d03d86ac0e51903ebbd6441399a290163a459/f7" data-source="Finding performance regressions" onmousemove="i18n(this)">&Ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&iecy;&ncy;&icy;&iecy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&acy; &pcy;&rcy;&ocy;&icy;&zcy;&vcy;&ocy;&dcy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy;&scy;&tcy;&icy;</span></h3> <p><span data-i18n="0d283c91efa1b8a466d90dde4e7f957334fa5db24401909a40aa904f84cc2181/bb" data-source="Here is an example script that comes slightly modified from a real world script used by Junio Hamano &lt;a href=&quot;#4&quot;&gt;[4]&lt;/a&gt;." onmousemove="i18n(this)">&Vcy;&ocy;&tcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&yacy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &ncy;&iecy;&mcy;&ncy;&ocy;&gcy;&ocy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy; &ncy;&acy; &ocy;&scy;&ncy;&ocy;&vcy;&iecy; &rcy;&iecy;&acy;&lcy;&softcy;&ncy;&ocy;&gcy;&ocy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&yacy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&mcy;&ocy;&gcy;&ocy; &Dcy;&zhcy;&ucy;&ncy;&icy;&ocy; &KHcy;&acy;&mcy;&acy;&ncy;&ocy;  <a href="git-bisect-lk2009.html#4">[4]</a> .</span></p> <p><span data-i18n="601551c2d2c6b38eab5584d37b0d0d24349fba254ed142c481c5d25af1884da8/3a" data-source="This script can be passed to &amp;quot;git bisect run&amp;quot; to find the commit that introduced a performance regression:" onmousemove="i18n(this)">&Ecy;&tcy;&ocy;&tcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy; &mcy;&ocy;&zhcy;&ncy;&ocy; &pcy;&iecy;&rcy;&iecy;&dcy;&acy;&tcy;&softcy;  &quot;git bisect run&quot; , &chcy;&tcy;&ocy;&bcy;&ycy; &ncy;&acy;&jcy;&tcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &pcy;&rcy;&icy;&vcy;&iecy;&lcy; &kcy; &scy;&ncy;&icy;&zhcy;&iecy;&ncy;&icy;&yucy; &pcy;&rcy;&ocy;&icy;&zcy;&vcy;&ocy;&dcy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy;&scy;&tcy;&icy;:</span></p> <div> <div> <pre class="hljs language-bash"><span class="hljs-meta">#!/bin/sh</span>

<span class="hljs-comment" title="# Build errors are not what I am interested in."># &Ocy;&shcy;&icy;&bcy;&kcy;&icy; &scy;&bcy;&ocy;&rcy;&kcy;&icy; &mdash; &ecy;&tcy;&ocy; &ncy;&iecy; &tcy;&ocy;, &chcy;&tcy;&ocy; &mcy;&iecy;&ncy;&yacy; &icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ucy;&iecy;&tcy;.</span>
make my_app || <span class="hljs-built_in">exit</span> 255

<span class="hljs-comment" title="# We are checking if it stops in a reasonable amount of time, so"># &Mcy;&ycy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;, &ocy;&scy;&tcy;&acy;&ncy;&ocy;&vcy;&icy;&tcy;&scy;&yacy; &lcy;&icy; &ocy;&ncy; &chcy;&iecy;&rcy;&iecy;&zcy; &rcy;&acy;&zcy;&ucy;&mcy;&ncy;&ocy;&iecy; &vcy;&rcy;&iecy;&mcy;&yacy;, &pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy;</span>
<span class="hljs-comment" title="# let it run in the background..."># &pcy;&ucy;&scy;&tcy;&softcy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy; &vcy; &fcy;&ocy;&ncy;&ocy;&vcy;&ocy;&mcy; &rcy;&iecy;&zhcy;&icy;&mcy;&iecy;...</span>

./my_app &gt;<span class="hljs-built_in">log</span> 2&gt;&amp;1 &amp;

<span class="hljs-comment" title="# ... and grab its process ID."># ... &icy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy; &icy;&dcy;&iecy;&ncy;&tcy;&icy;&fcy;&icy;&kcy;&acy;&tcy;&ocy;&rcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;&acy;.</span>
pid=$!

<span class="hljs-comment" title="# ... and then wait for sufficiently long."># ... &acy; &zcy;&acy;&tcy;&iecy;&mcy; &pcy;&ocy;&dcy;&ocy;&zhcy;&dcy;&icy;&tcy;&iecy; &dcy;&ocy;&scy;&tcy;&acy;&tcy;&ocy;&chcy;&ncy;&ocy; &dcy;&ocy;&lcy;&gcy;&ocy;.</span>
<span class="hljs-built_in">sleep</span> <span class="hljs-variable">$NORMAL_TIME</span>

<span class="hljs-comment" title="# ... and then see if the process is still there."># ... &acy; &zcy;&acy;&tcy;&iecy;&mcy; &pcy;&ocy;&scy;&mcy;&ocy;&tcy;&rcy;&iecy;&tcy;&softcy;, &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy; &lcy;&icy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;.</span>
<span class="hljs-keyword">if</span> <span class="hljs-built_in">kill</span> -0 <span class="hljs-variable">$pid</span>
<span class="hljs-keyword">then</span>
        <span class="hljs-comment" title="# It is still running -- that is bad."># &Ocy;&ncy; &vcy;&scy;&iecy; &iecy;&shchcy;&iecy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy; - &ecy;&tcy;&ocy; &pcy;&lcy;&ocy;&khcy;&ocy;.</span>
        <span class="hljs-built_in">kill</span> <span class="hljs-variable">$pid</span>; <span class="hljs-built_in">sleep</span> 1; <span class="hljs-built_in">kill</span> <span class="hljs-variable">$pid</span>;
        <span class="hljs-built_in">exit</span> 1
<span class="hljs-keyword">else</span>
        <span class="hljs-comment" title="# It has already finished (the $pid process was no more),"># &Ocy;&ncy; &ucy;&zhcy;&iecy; &zcy;&acy;&vcy;&iecy;&rcy;&shcy;&iecy;&ncy; (&pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;&acy; $pid &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &ncy;&iecy;&tcy;),</span>
        <span class="hljs-comment" title="# and we are happy."># &icy; &mcy;&ycy; &scy;&chcy;&acy;&scy;&tcy;&lcy;&icy;&vcy;&ycy;.</span>
        <span class="hljs-built_in">exit</span> 0
<span class="hljs-keyword">fi</span></pre> </div> </div> </div> <div> <h3 class="text-body-emphasis"  id="_following_general_best_practices"><span data-i18n="1e895a6221eda32220c54ef8b6144b2934ce37f54855e7fb2235dc994230edfc/44" data-source="Following general best practices" onmousemove="i18n(this)">&Scy;&lcy;&iecy;&dcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; &ocy;&bcy;&shchcy;&icy;&mcy; &rcy;&iecy;&kcy;&ocy;&mcy;&iecy;&ncy;&dcy;&acy;&tscy;&icy;&yacy;&mcy;</span></h3> <p><span data-i18n="bd28a670ecf894cfb881ad63bde7d73ee1738ce999010593440b0d2e33709293/69" data-source="It is obviously a good idea not to have commits with changes that knowingly break things, even if some other commits later fix the breakage." onmousemove="i18n(this)">&Ocy;&chcy;&iecy;&vcy;&icy;&dcy;&ncy;&ocy;, &chcy;&tcy;&ocy; &ncy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &scy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy;&mcy;&icy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &scy;&ocy;&zcy;&ncy;&acy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy; &chcy;&tcy;&ocy;-&tcy;&ocy; &lcy;&ocy;&mcy;&acy;&yucy;&tcy;, &mdash; &khcy;&ocy;&rcy;&ocy;&shcy;&acy;&yacy; &icy;&dcy;&iecy;&yacy;, &dcy;&acy;&zhcy;&iecy; &iecy;&scy;&lcy;&icy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &dcy;&rcy;&ucy;&gcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &pcy;&ocy;&zcy;&zhcy;&iecy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&yacy;&tcy; &pcy;&ocy;&lcy;&ocy;&mcy;&kcy;&ucy;.</span></p> <p><span data-i18n="f5c50952673fc0348886526a71bf8628e267476531b1e3dd64d50645efdd43b3/72" data-source="It is also a good idea when using any VCS to have only one small logical change in each commit." onmousemove="i18n(this)">&Tcy;&acy;&kcy;&zhcy;&iecy; &pcy;&rcy;&icy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&icy; &lcy;&yucy;&bcy;&ocy;&jcy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&ycy; &kcy;&ocy;&ncy;&tcy;&rcy;&ocy;&lcy;&yacy; &vcy;&iecy;&rcy;&scy;&icy;&jcy; &rcy;&iecy;&kcy;&ocy;&mcy;&iecy;&ncy;&dcy;&ucy;&iecy;&tcy;&scy;&yacy; &vcy;&ncy;&ocy;&scy;&icy;&tcy;&softcy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &ocy;&dcy;&ncy;&ocy; &ncy;&iecy;&bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&iecy; &lcy;&ocy;&gcy;&icy;&chcy;&iecy;&scy;&kcy;&ocy;&iecy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&iecy; &vcy; &kcy;&acy;&zhcy;&dcy;&ycy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;.</span></p> <p><span data-i18n="bf62b8b6db2b521a9a40ebcc2fc980861106c7d566c4a272310ee7f2362167ef/68" data-source="The smaller the changes in your commit, the most effective &amp;quot;git bisect&amp;quot; will be. And you will probably need &amp;quot;git bisect&amp;quot; less in the first place, as small changes are easier to review even if they are only reviewed by the committer." onmousemove="i18n(this)">&CHcy;&iecy;&mcy; &mcy;&iecy;&ncy;&softcy;&shcy;&iecy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&jcy; &vcy; &vcy;&acy;&shcy;&iecy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&iecy;, &tcy;&iecy;&mcy; &ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&iecy;&iecy; &bcy;&ucy;&dcy;&iecy;&tcy;  &quot;git bisect&quot; . &Icy; &vcy; &pcy;&iecy;&rcy;&vcy;&ucy;&yucy; &ocy;&chcy;&iecy;&rcy;&iecy;&dcy;&softcy; &vcy;&acy;&mcy;, &vcy;&iecy;&rcy;&ocy;&yacy;&tcy;&ncy;&ocy;, &pcy;&ocy;&ncy;&acy;&dcy;&ocy;&bcy;&icy;&tcy;&scy;&yacy; &mcy;&iecy;&ncy;&softcy;&shcy;&iecy;  &quot;git bisect&quot; , &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ncy;&iecy;&bcy;&ocy;&lcy;&softcy;&shcy;&icy;&iecy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy; &lcy;&iecy;&gcy;&chcy;&iecy; &pcy;&rcy;&ocy;&scy;&mcy;&acy;&tcy;&rcy;&icy;&vcy;&acy;&tcy;&softcy;, &dcy;&acy;&zhcy;&iecy; &iecy;&scy;&lcy;&icy; &ocy;&ncy;&icy; &pcy;&rcy;&ocy;&scy;&mcy;&acy;&tcy;&rcy;&icy;&vcy;&acy;&yucy;&tcy;&scy;&yacy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&tcy;&iecy;&rcy;&ocy;&mcy;.</span></p> <p><span data-i18n="eb01a82b19607da276bc7c6507c5cf99476adc59a67d48961aa08cc35575c707/80" data-source="Another good idea is to have good commit messages. They can be very helpful to understand why some changes were made." onmousemove="i18n(this)">&IEcy;&shchcy;&iecy; &ocy;&dcy;&ncy;&acy; &khcy;&ocy;&rcy;&ocy;&shcy;&acy;&yacy; &icy;&dcy;&iecy;&yacy; &mdash; &icy;&mcy;&iecy;&tcy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&iecy; &scy;&ocy;&ocy;&bcy;&shchcy;&iecy;&ncy;&icy;&yacy; &ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&khcy;. &Ocy;&ncy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &bcy;&ycy;&tcy;&softcy; &ocy;&chcy;&iecy;&ncy;&softcy; &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ycy;, &chcy;&tcy;&ocy;&bcy;&ycy; &pcy;&ocy;&ncy;&yacy;&tcy;&softcy;, &pcy;&ocy;&chcy;&iecy;&mcy;&ucy; &bcy;&ycy;&lcy;&icy; &vcy;&ncy;&iecy;&scy;&iecy;&ncy;&ycy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy;.</span></p> <p><span data-i18n="ae454ddb48ccd2c64c3ecb787741e45b4e40a0b7f5d57ce66bcfe41e93b259bf/76" data-source="These general best practices are very helpful if you bisect often." onmousemove="i18n(this)">&Ecy;&tcy;&icy; &ocy;&bcy;&shchcy;&icy;&iecy; &rcy;&iecy;&kcy;&ocy;&mcy;&iecy;&ncy;&dcy;&acy;&tscy;&icy;&icy; &ocy;&chcy;&iecy;&ncy;&softcy; &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ycy;, &iecy;&scy;&lcy;&icy; &vcy;&ycy; &chcy;&acy;&scy;&tcy;&ocy; &dcy;&iecy;&lcy;&icy;&tcy;&iecy;&scy;&softcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_avoiding_bug_prone_merges"><span data-i18n="2205b613c078adb5d7e8d823290c4b17f7656f4d2232189ac5217228bf4a9ab1/e5" data-source="Avoiding bug prone merges" onmousemove="i18n(this)">&Kcy;&acy;&kcy; &icy;&zcy;&bcy;&iecy;&zhcy;&acy;&tcy;&softcy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&jcy;, &pcy;&ocy;&dcy;&vcy;&iecy;&rcy;&zhcy;&iecy;&ncy;&ncy;&ycy;&khcy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;&mcy;</span></h3> <p><span data-i18n="2f2ef7446176cf56f62206d7e336438985e652f921fe44674271a4f157b611e6/8b" data-source="First merges by themselves can introduce some regressions even when the merge needs no source code conflict resolution. This is because a semantic change can happen in one branch while the other branch is not aware of it." onmousemove="i18n(this)">&Pcy;&iecy;&rcy;&vcy;&ycy;&iecy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &scy;&acy;&mcy;&icy; &pcy;&ocy; &scy;&iecy;&bcy;&iecy; &mcy;&ocy;&gcy;&ucy;&tcy; &pcy;&rcy;&icy;&vcy;&iecy;&scy;&tcy;&icy; &kcy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&mcy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yacy;&mcy;, &dcy;&acy;&zhcy;&iecy; &iecy;&scy;&lcy;&icy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&iecy; &ncy;&iecy; &tcy;&rcy;&iecy;&bcy;&ucy;&iecy;&tcy; &rcy;&acy;&zcy;&rcy;&iecy;&shcy;&iecy;&ncy;&icy;&yacy; &kcy;&ocy;&ncy;&fcy;&lcy;&icy;&kcy;&tcy;&ocy;&vcy; &icy;&scy;&khcy;&ocy;&dcy;&ncy;&ocy;&gcy;&ocy; &kcy;&ocy;&dcy;&acy;. &Ecy;&tcy;&ocy; &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ocy; &scy; &tcy;&iecy;&mcy;, &chcy;&tcy;&ocy; &scy;&iecy;&mcy;&acy;&ncy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&ocy;&iecy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&iecy; &mcy;&ocy;&zhcy;&iecy;&tcy; &pcy;&rcy;&ocy;&icy;&zcy;&ocy;&jcy;&tcy;&icy; &vcy; &ocy;&dcy;&ncy;&ocy;&jcy; &vcy;&iecy;&tcy;&vcy;&icy;, &vcy; &tcy;&ocy; &vcy;&rcy;&iecy;&mcy;&yacy; &kcy;&acy;&kcy; &dcy;&rcy;&ucy;&gcy;&acy;&yacy; &vcy;&iecy;&tcy;&vcy;&softcy; &ncy;&iecy; &zcy;&ncy;&acy;&iecy;&tcy; &ocy;&bcy; &ecy;&tcy;&ocy;&mcy;.</span></p> <p><span data-i18n="91e9cd864c28600a2df4d810257c8b71c6a765957a30d92d8eb56dd0ec72dedc/33" data-source="For example one branch can change the semantic of a function while the other branch add more calls to the same function." onmousemove="i18n(this)">&Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &ocy;&dcy;&ncy;&acy; &vcy;&iecy;&tcy;&vcy;&softcy; &mcy;&ocy;&zhcy;&iecy;&tcy; &icy;&zcy;&mcy;&iecy;&ncy;&icy;&tcy;&softcy; &scy;&iecy;&mcy;&acy;&ncy;&tcy;&icy;&kcy;&ucy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&icy;, &acy; &dcy;&rcy;&ucy;&gcy;&acy;&yacy; &dcy;&ocy;&bcy;&acy;&vcy;&icy;&tcy;&softcy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &vcy;&ycy;&zcy;&ocy;&vcy;&ocy;&vcy; &tcy;&ocy;&jcy; &zhcy;&iecy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&icy;.</span></p> <p><span data-i18n="7a98360947563818cf23f26a8704abb9e5c5b708183c89996d2eafb2062f01fa/38" data-source="This is made much worse if many files have to be fixed to resolve conflicts. That&amp;rsquo;s why such merges are called &amp;quot;evil merges&amp;quot;. They can make regressions very difficult to track down. It can even be misleading to know the first bad commit if it happens to be such a merge, because people might think that the bug comes from bad conflict resolution when it comes from a semantic change in one branch." onmousemove="i18n(this)">&Scy;&icy;&tcy;&ucy;&acy;&tscy;&icy;&yacy; &ucy;&scy;&ucy;&gcy;&ucy;&bcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy;, &iecy;&scy;&lcy;&icy; &dcy;&lcy;&yacy; &rcy;&acy;&zcy;&rcy;&iecy;&shcy;&iecy;&ncy;&icy;&yacy; &kcy;&ocy;&ncy;&fcy;&lcy;&icy;&kcy;&tcy;&ocy;&vcy; &pcy;&rcy;&icy;&khcy;&ocy;&dcy;&icy;&tcy;&scy;&yacy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&tcy;&softcy; &mcy;&ncy;&ocy;&zhcy;&iecy;&scy;&tcy;&vcy;&ocy; &fcy;&acy;&jcy;&lcy;&ocy;&vcy;. &Pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &tcy;&acy;&kcy;&icy;&iecy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &ncy;&acy;&zcy;&ycy;&vcy;&acy;&yucy;&tcy;&scy;&yacy;  &quot;evil merges&quot; . &Ocy;&ncy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &zcy;&acy;&tcy;&rcy;&ucy;&dcy;&ncy;&icy;&tcy;&softcy; &ocy;&tcy;&scy;&lcy;&iecy;&zhcy;&icy;&vcy;&acy;&ncy;&icy;&iecy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&jcy;. &Zcy;&ncy;&acy;&ncy;&icy;&iecy; &pcy;&iecy;&rcy;&vcy;&ocy;&gcy;&ocy; &ncy;&iecy;&ucy;&dcy;&acy;&chcy;&ncy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy; &mcy;&ocy;&zhcy;&iecy;&tcy; &dcy;&acy;&zhcy;&iecy; &vcy;&vcy;&iecy;&scy;&tcy;&icy; &vcy; &zcy;&acy;&bcy;&lcy;&ucy;&zhcy;&dcy;&iecy;&ncy;&icy;&iecy;, &iecy;&scy;&lcy;&icy; &ecy;&tcy;&ocy; &tcy;&acy;&kcy;&ocy;&iecy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&iecy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &lcy;&yucy;&dcy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &pcy;&ocy;&dcy;&ucy;&mcy;&acy;&tcy;&softcy;, &chcy;&tcy;&ocy; &ocy;&shcy;&icy;&bcy;&kcy;&acy; &vcy;&ocy;&zcy;&ncy;&icy;&kcy;&acy;&iecy;&tcy; &icy;&zcy;-&zcy;&acy; &pcy;&lcy;&ocy;&khcy;&ocy;&gcy;&ocy; &rcy;&acy;&zcy;&rcy;&iecy;&shcy;&iecy;&ncy;&icy;&yacy; &kcy;&ocy;&ncy;&fcy;&lcy;&icy;&kcy;&tcy;&acy;, &kcy;&ocy;&gcy;&dcy;&acy; &ocy;&ncy;&acy; &vcy;&ocy;&zcy;&ncy;&icy;&kcy;&acy;&iecy;&tcy; &icy;&zcy;-&zcy;&acy; &scy;&iecy;&mcy;&acy;&ncy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&ocy;&gcy;&ocy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy; &vcy; &ocy;&dcy;&ncy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&iecy;.</span></p> <p><span data-i18n="66fdf4ba21706df57cede265edf58b9fff039243bfb60b4ac48d894fe5de1380/50" data-source="Anyway &amp;quot;git rebase&amp;quot; can be used to linearize history. This can be used either to avoid merging in the first place. Or it can be used to bisect on a linear history instead of the non linear one, as this should give more information in case of a semantic change in one branch." onmousemove="i18n(this)">&Vcy; &lcy;&yucy;&bcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;  &quot;git rebase&quot;  &mcy;&ocy;&zhcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &dcy;&lcy;&yacy; &lcy;&icy;&ncy;&iecy;&acy;&rcy;&icy;&zcy;&acy;&tscy;&icy;&icy; &icy;&scy;&tcy;&ocy;&rcy;&icy;&icy;. &Ecy;&tcy;&ocy; &mcy;&ocy;&zhcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &lcy;&icy;&bcy;&ocy; &dcy;&lcy;&yacy; &tcy;&ocy;&gcy;&ocy;, &chcy;&tcy;&ocy;&bcy;&ycy; &icy;&zcy;&bcy;&iecy;&zhcy;&acy;&tcy;&softcy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy;. &Icy;&lcy;&icy; &iecy;&gcy;&ocy; &mcy;&ocy;&zhcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &dcy;&lcy;&yacy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &lcy;&icy;&ncy;&iecy;&jcy;&ncy;&ocy;&jcy; &icy;&scy;&tcy;&ocy;&rcy;&icy;&icy; &vcy;&mcy;&iecy;&scy;&tcy;&ocy; &ncy;&iecy;&lcy;&icy;&ncy;&iecy;&jcy;&ncy;&ocy;&jcy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ecy;&tcy;&ocy; &dcy;&ocy;&lcy;&zhcy;&ncy;&ocy; &dcy;&acy;&tcy;&softcy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy; &vcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy; &scy;&iecy;&mcy;&acy;&ncy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&ocy;&gcy;&ocy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy; &vcy; &ocy;&dcy;&ncy;&ocy;&jcy; &vcy;&iecy;&tcy;&vcy;&icy;.</span></p> <p><span data-i18n="7bc317ff7f331bbabfcfc3cf18bdcfd098591a207d713ab82e9b02016dd6020a/33" data-source="Merges can be also made simpler by using smaller branches or by using many topic branches instead of only long version related branches." onmousemove="i18n(this)">&Scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy; &tcy;&acy;&kcy;&zhcy;&iecy; &mcy;&ocy;&zhcy;&ncy;&ocy; &ucy;&pcy;&rcy;&ocy;&scy;&tcy;&icy;&tcy;&softcy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yacy; &vcy;&iecy;&tcy;&kcy;&icy; &mcy;&iecy;&ncy;&softcy;&shcy;&iecy;&gcy;&ocy; &rcy;&acy;&zcy;&mcy;&iecy;&rcy;&acy; &icy;&lcy;&icy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yacy; &mcy;&ncy;&ocy;&zhcy;&iecy;&scy;&tcy;&vcy;&ocy; &tcy;&iecy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;&khcy; &vcy;&iecy;&tcy;&vcy;&iecy;&jcy; &vcy;&mcy;&iecy;&scy;&tcy;&ocy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &dcy;&lcy;&icy;&ncy;&ncy;&ycy;&khcy; &vcy;&iecy;&tcy;&vcy;&iecy;&jcy;, &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ncy;&ycy;&khcy; &scy; &vcy;&iecy;&rcy;&scy;&icy;&iecy;&jcy;.</span></p> <p><span data-i18n="30dab8f7197f6cd8c7acb4312af7f134e1293ea47701203014da3e04a730aa97/6d" data-source="And testing can be done more often in special integration branches like linux-next for the linux kernel." onmousemove="i18n(this)">&Acy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; &mcy;&ocy;&zhcy;&ncy;&ocy; &pcy;&rcy;&ocy;&vcy;&ocy;&dcy;&icy;&tcy;&softcy; &chcy;&acy;&shchcy;&iecy; &vcy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&khcy; &vcy;&iecy;&tcy;&kcy;&acy;&khcy; &icy;&ncy;&tcy;&iecy;&gcy;&rcy;&acy;&tscy;&icy;&icy; &tcy;&icy;&pcy;&acy; linux-next &dcy;&lcy;&yacy; &yacy;&dcy;&rcy;&acy; Linux.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_adapting_your_work_flow"><span data-i18n="bcf4455c7da9544227146bd34108c6e23bd2a89279b441977a3441165f3fb1ce/dc" data-source="Adapting your work-flow" onmousemove="i18n(this)">&Acy;&dcy;&acy;&pcy;&tcy;&acy;&tscy;&icy;&yacy; &vcy;&acy;&shcy;&iecy;&gcy;&ocy; &rcy;&acy;&bcy;&ocy;&chcy;&iecy;&gcy;&ocy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;&acy;</span></h3> <p><span data-i18n="9857e6d7ba0a97ea0094f1b4e9e83dd102cb115677c65e7f4d3e23f5b2d6c368/9f" data-source="A special work-flow to process regressions can give great results." onmousemove="i18n(this)">&Scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&jcy; &rcy;&acy;&bcy;&ocy;&chcy;&icy;&jcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&lcy;&yacy; &ocy;&bcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&icy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&jcy; &mcy;&ocy;&zhcy;&iecy;&tcy; &dcy;&acy;&tcy;&softcy; &ocy;&tcy;&lcy;&icy;&chcy;&ncy;&ycy;&iecy; &rcy;&iecy;&zcy;&ucy;&lcy;&softcy;&tcy;&acy;&tcy;&ycy;.</span></p> <p><span data-i18n="bbc0c1ab5609ccb8d523514e325595925e920b39c8860b804ad7d9f16eb729a2/85" data-source="Here is an example of a work-flow used by Andreas Ericsson:" onmousemove="i18n(this)">&Vcy;&ocy;&tcy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy; &rcy;&acy;&bcy;&ocy;&chcy;&iecy;&gcy;&ocy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;&acy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&ncy;&ocy;&gcy;&ocy; &Acy;&ncy;&dcy;&rcy;&iecy;&acy;&scy;&ocy;&mcy; &Ecy;&rcy;&icy;&kcy;&scy;&scy;&ocy;&ncy;&ocy;&mcy;:</span></p> <div> <ul> <li> <p><span data-i18n="914224025eb4a7bcf0c5cbef55ea301b0420c5d4fce8a3730e6e3eb1e82bd2d6/a9" data-source="write, in the test suite, a test script that exposes the regression" onmousemove="i18n(this)">&ncy;&acy;&pcy;&icy;&shcy;&icy;&tcy;&iecy; &vcy; &ncy;&acy;&bcy;&ocy;&rcy;&iecy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&jcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &vcy;&ycy;&yacy;&vcy;&lcy;&yacy;&iecy;&tcy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yucy;</span></p> </li> <li> <p><span data-i18n="4b4bd29cac8da62896d7fbf46b9434e52d88b9520b3bf831a7a0bfb4099c32b2/f3" data-source="use &amp;quot;git bisect run&amp;quot; to find the commit that introduced it" onmousemove="i18n(this)">&icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&jcy;&tcy;&iecy;  &quot;git bisect run&quot; , &chcy;&tcy;&ocy;&bcy;&ycy; &ncy;&acy;&jcy;&tcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &iecy;&gcy;&ocy; &pcy;&rcy;&iecy;&dcy;&scy;&tcy;&acy;&vcy;&icy;&lcy;</span></p> </li> <li> <p><span data-i18n="f01792b5d71f26f0937edc60397bde369e585f517f21a5008a9ca08eb68ef599/dc" data-source="fix the bug that is often made obvious by the previous step" onmousemove="i18n(this)">&icy;&scy;&pcy;&rcy;&acy;&vcy;&icy;&tcy;&softcy; &ocy;&shcy;&icy;&bcy;&kcy;&ucy;, &kcy;&ocy;&tcy;&ocy;&rcy;&acy;&yacy; &chcy;&acy;&scy;&tcy;&ocy; &scy;&tcy;&acy;&ncy;&ocy;&vcy;&icy;&tcy;&scy;&yacy; &ocy;&chcy;&iecy;&vcy;&icy;&dcy;&ncy;&ocy;&jcy; &ncy;&acy; &pcy;&rcy;&iecy;&dcy;&ycy;&dcy;&ucy;&shchcy;&iecy;&mcy; &shcy;&acy;&gcy;&iecy;</span></p> </li> <li> <p><span data-i18n="31ac63f5d52e5bfd8ca097a074db32f54463a78a455a7d59e97d61adb71646a0/0a" data-source="commit both the fix and the test script (and if needed more tests)" onmousemove="i18n(this)">&zcy;&acy;&fcy;&icy;&kcy;&scy;&icy;&rcy;&ucy;&jcy;&tcy;&iecy; &kcy;&acy;&kcy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&iecy;, &tcy;&acy;&kcy; &icy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&jcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy; (&icy;, &iecy;&scy;&lcy;&icy; &ncy;&iecy;&ocy;&bcy;&khcy;&ocy;&dcy;&icy;&mcy;&ocy;, &dcy;&ocy;&pcy;&ocy;&lcy;&ncy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ycy;&iecy; &tcy;&iecy;&scy;&tcy;&ycy;)</span></p> </li> </ul> </div> <p><span data-i18n="0388bc494b530b72fef755d0ad4fcb90882d2a17eeba4a9f755065cc145aa16a/58" data-source="And here is what Andreas said about this work-flow &lt;a href=&quot;#5&quot;&gt;[5]&lt;/a&gt;:" onmousemove="i18n(this)">&Acy; &vcy;&ocy;&tcy; &chcy;&tcy;&ocy; &scy;&kcy;&acy;&zcy;&acy;&lcy; &Acy;&ncy;&dcy;&rcy;&iecy;&acy;&scy; &ocy;&bcy; &ecy;&tcy;&ocy;&mcy; &rcy;&acy;&bcy;&ocy;&chcy;&iecy;&mcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;&iecy;  <a href="git-bisect-lk2009.html#5">[5]</a> :</span></p> <div> <blockquote> <p><span data-i18n="948b52a7f66ff3b3bd88b473a09659aa73949ab2e2d7e3cb93fed5d356fff0e5/57" data-source="To give some hard figures, we used to have an average report-to-fix cycle of 142.6 hours (according to our somewhat weird bug-tracker which just measures wall-clock time). Since we moved to Git, we&amp;rsquo;ve lowered that to 16.2 hours. Primarily because we can stay on top of the bug fixing now, and because everyone&amp;rsquo;s jockeying to get to fix bugs (we&amp;rsquo;re quite proud of how lazy we are to let Git find the bugs for us). Each new release results in ~40% fewer bugs (almost certainly due to how we now feel about writing tests)." onmousemove="i18n(this)">&CHcy;&tcy;&ocy;&bcy;&ycy; &dcy;&acy;&tcy;&softcy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &tcy;&ocy;&chcy;&ncy;&ycy;&iecy; &tscy;&icy;&fcy;&rcy;&ycy;, &ucy; &ncy;&acy;&scy; &scy;&rcy;&iecy;&dcy;&ncy;&icy;&jcy; &tscy;&icy;&kcy;&lcy; &ocy;&tcy;&chcy;&iecy;&tcy;&acy; &icy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&yacy; &scy;&ocy;&scy;&tcy;&acy;&vcy;&lcy;&yacy;&lcy; 142,6 &chcy;&acy;&scy;&acy; (&scy;&ocy;&gcy;&lcy;&acy;&scy;&ncy;&ocy; &ncy;&acy;&shcy;&iecy;&mcy;&ucy; &ncy;&iecy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ocy; &scy;&tcy;&rcy;&acy;&ncy;&ncy;&ocy;&mcy;&ucy; &tcy;&rcy;&iecy;&kcy;&iecy;&rcy;&ucy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &pcy;&rcy;&ocy;&scy;&tcy;&ocy; &icy;&zcy;&mcy;&iecy;&rcy;&yacy;&iecy;&tcy; &vcy;&rcy;&iecy;&mcy;&yacy; &ncy;&acy; &ncy;&acy;&scy;&tcy;&iecy;&ncy;&ncy;&ycy;&khcy; &chcy;&acy;&scy;&acy;&khcy;). &Scy; &tcy;&iecy;&khcy; &pcy;&ocy;&rcy;, &kcy;&acy;&kcy; &mcy;&ycy; &pcy;&iecy;&rcy;&iecy;&shcy;&lcy;&icy; &ncy;&acy;  Git , &mcy;&ycy; &scy;&ncy;&icy;&zcy;&icy;&lcy;&icy; &ecy;&tcy;&ocy; &vcy;&rcy;&iecy;&mcy;&yacy; &dcy;&ocy; 16,2 &chcy;&acy;&scy;&acy;. &Vcy; &pcy;&iecy;&rcy;&vcy;&ucy;&yucy; &ocy;&chcy;&iecy;&rcy;&iecy;&dcy;&softcy; &pcy;&ocy;&tcy;&ocy;&mcy;&ucy;, &chcy;&tcy;&ocy; &scy;&iecy;&jcy;&chcy;&acy;&scy; &mcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&mcy; &bcy;&ycy;&tcy;&softcy; &vcy; &kcy;&ucy;&rcy;&scy;&iecy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&yacy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;, &icy; &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &vcy;&scy;&iecy; &scy;&tcy;&acy;&rcy;&acy;&yucy;&tcy;&scy;&yacy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&icy;&tcy;&softcy; &ocy;&shcy;&icy;&bcy;&kcy;&icy; (&mcy;&ycy; &ocy;&chcy;&iecy;&ncy;&softcy; &gcy;&ocy;&rcy;&dcy;&icy;&mcy;&scy;&yacy; &tcy;&iecy;&mcy;, &ncy;&acy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ocy; &lcy;&iecy;&ncy;&icy;&vcy;&ycy;, &chcy;&tcy;&ocy; &pcy;&ocy;&zcy;&vcy;&ocy;&lcy;&yacy;&iecy;&mcy;  Git  &ncy;&acy;&khcy;&ocy;&dcy;&icy;&tcy;&softcy; &ocy;&shcy;&icy;&bcy;&kcy;&icy; &zcy;&acy; &ncy;&acy;&scy;). &Vcy; &kcy;&acy;&zhcy;&dcy;&ocy;&mcy; &ncy;&ocy;&vcy;&ocy;&mcy; &vcy;&ycy;&pcy;&ucy;&scy;&kcy;&iecy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy; &pcy;&ocy;&yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&ncy;&ocy; &ncy;&acy; 40% &mcy;&iecy;&ncy;&softcy;&shcy;&iecy; (&pcy;&ocy;&chcy;&tcy;&icy; &ncy;&acy;&vcy;&iecy;&rcy;&ncy;&yacy;&kcy;&acy; &icy;&zcy;-&zcy;&acy; &tcy;&ocy;&gcy;&ocy;, &kcy;&acy;&kcy; &mcy;&ycy; &scy;&iecy;&jcy;&chcy;&acy;&scy; &ocy;&tcy;&ncy;&ocy;&scy;&icy;&mcy;&scy;&yacy; &kcy; &ncy;&acy;&pcy;&icy;&scy;&acy;&ncy;&icy;&yucy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;).</span></p> </blockquote> </div> <p><span data-i18n="289d670907e2eb33a4626f7f2d903a36224e97559a4057603a61abb20227df30/aa" data-source="Clearly this work-flow uses the virtuous circle between test suites and &amp;quot;git bisect&amp;quot;. In fact it makes it the standard procedure to deal with regression." onmousemove="i18n(this)">&Ocy;&chcy;&iecy;&vcy;&icy;&dcy;&ncy;&ocy;, &chcy;&tcy;&ocy; &ecy;&tcy;&ocy;&tcy; &rcy;&acy;&bcy;&ocy;&chcy;&icy;&jcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy; &bcy;&lcy;&acy;&gcy;&ocy;&tcy;&vcy;&ocy;&rcy;&ncy;&ycy;&jcy; &kcy;&rcy;&ucy;&gcy; &mcy;&iecy;&zhcy;&dcy;&ucy; &ncy;&acy;&bcy;&ocy;&rcy;&acy;&mcy;&icy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &icy;  &quot;git bisect&quot; . &Fcy;&acy;&kcy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;, &ecy;&tcy;&ocy; &scy;&tcy;&acy;&ncy;&dcy;&acy;&rcy;&tcy;&ncy;&acy;&yacy; &pcy;&rcy;&ocy;&tscy;&iecy;&dcy;&ucy;&rcy;&acy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&iecy;&jcy;.</span></p> <p><span data-i18n="92f7a4d9858c5732e65217ce97740a3fa8941d0359eb757dd892284e772faadc/1b" data-source="In other messages Andreas says that they also use the &amp;quot;best practices&amp;quot; described above: small logical commits, topic branches, no evil merge,&amp;hellip;These practices all improve the bisectability of the commit graph, by making it easier and more useful to bisect." onmousemove="i18n(this)">&Vcy; &dcy;&rcy;&ucy;&gcy;&icy;&khcy; &scy;&ocy;&ocy;&bcy;&shchcy;&iecy;&ncy;&icy;&yacy;&khcy; &Acy;&ncy;&dcy;&rcy;&iecy;&acy;&scy; &gcy;&ocy;&vcy;&ocy;&rcy;&icy;&tcy;, &chcy;&tcy;&ocy; &ocy;&ncy;&icy; &tcy;&acy;&kcy;&zhcy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yucy;&tcy; &ocy;&pcy;&icy;&scy;&acy;&ncy;&ncy;&ycy;&jcy; &vcy;&ycy;&shcy;&iecy;  &quot;best practices&quot; : &ncy;&iecy;&bcy;&ocy;&lcy;&softcy;&shcy;&icy;&iecy; &lcy;&ocy;&gcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &tcy;&iecy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;&iecy; &vcy;&iecy;&tcy;&kcy;&icy;, &ocy;&tcy;&scy;&ucy;&tcy;&scy;&tcy;&vcy;&icy;&iecy; &zcy;&lcy;&ocy;&gcy;&ocy; &scy;&lcy;&icy;&yacy;&ncy;&icy;&yacy;... &Vcy;&scy;&iecy; &ecy;&tcy;&icy; &mcy;&iecy;&tcy;&ocy;&dcy;&ycy; &ucy;&lcy;&ucy;&chcy;&shcy;&acy;&yucy;&tcy; &dcy;&iecy;&lcy;&icy;&mcy;&ocy;&scy;&tcy;&softcy; &gcy;&rcy;&acy;&fcy;&acy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;, &dcy;&iecy;&lcy;&acy;&yacy; &iecy;&gcy;&ocy; &bcy;&ocy;&lcy;&iecy;&iecy; &pcy;&rcy;&ocy;&scy;&tcy;&ycy;&mcy; &icy; &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ycy;&mcy;.</span></p> <p><span data-i18n="52ddd1729a7e2759f9e302849aac69de92d040f3131d59ef1ec2d7243b1c88cc/88" data-source="So a good work-flow should be designed around the above points. That is making bisecting easier, more useful and standard." onmousemove="i18n(this)">&Pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&jcy; &rcy;&acy;&bcy;&ocy;&chcy;&icy;&jcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy; &dcy;&ocy;&lcy;&zhcy;&iecy;&ncy; &bcy;&ycy;&tcy;&softcy; &pcy;&ocy;&scy;&tcy;&rcy;&ocy;&iecy;&ncy; &ncy;&acy; &ocy;&scy;&ncy;&ocy;&vcy;&iecy; &vcy;&ycy;&shcy;&iecy;&pcy;&iecy;&rcy;&iecy;&chcy;&icy;&scy;&lcy;&iecy;&ncy;&ncy;&ycy;&khcy; &pcy;&ucy;&ncy;&kcy;&tcy;&ocy;&vcy;. &Ecy;&tcy;&ocy; &dcy;&iecy;&lcy;&acy;&iecy;&tcy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &bcy;&ocy;&lcy;&iecy;&iecy; &pcy;&rcy;&ocy;&scy;&tcy;&ycy;&mcy;, &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ycy;&mcy; &icy; &scy;&tcy;&acy;&ncy;&dcy;&acy;&rcy;&tcy;&ncy;&ycy;&mcy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_involving_qa_people_and_if_possible_end_users"><span data-i18n="e8e16e21a090b1a9728199c825adaafe51e1ac109d9e6dbdce26025ee5608722/b9" data-source="Involving QA people and if possible end users" onmousemove="i18n(this)">&Pcy;&rcy;&icy;&vcy;&lcy;&iecy;&chcy;&iecy;&ncy;&icy;&iecy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&icy;&scy;&tcy;&ocy;&vcy; &pcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yucy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&acy; &icy;, &iecy;&scy;&lcy;&icy; &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy;, &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ycy;&khcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&iecy;&jcy;.</span></h3> <p><span data-i18n="f8ca199def2ee8690957c76cf61dc904901742b57c90dc7ad4f1fafbff9cbe49/af" data-source="One nice about &amp;quot;git bisect&amp;quot; is that it is not only a developer tool. It can effectively be used by QA people or even end users (if they have access to the source code or if they can get access to all the builds)." onmousemove="i18n(this)">&Vcy;  &quot;git bisect&quot;  &pcy;&rcy;&icy;&yacy;&tcy;&ncy;&ocy; &tcy;&ocy;, &chcy;&tcy;&ocy; &ecy;&tcy;&ocy; &ncy;&iecy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&acy;. &IEcy;&gcy;&ocy; &mcy;&ocy;&gcy;&ucy;&tcy; &ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &scy;&ocy;&tcy;&rcy;&ucy;&dcy;&ncy;&icy;&kcy;&icy; &ocy;&tcy;&dcy;&iecy;&lcy;&acy; &kcy;&ocy;&ncy;&tcy;&rcy;&ocy;&lcy;&yacy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&acy; &icy;&lcy;&icy; &dcy;&acy;&zhcy;&iecy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ycy;&iecy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&icy; (&iecy;&scy;&lcy;&icy; &ucy; &ncy;&icy;&khcy; &iecy;&scy;&tcy;&softcy; &dcy;&ocy;&scy;&tcy;&ucy;&pcy; &kcy; &icy;&scy;&khcy;&ocy;&dcy;&ncy;&ocy;&mcy;&ucy; &kcy;&ocy;&dcy;&ucy; &icy;&lcy;&icy; &iecy;&scy;&lcy;&icy; &ocy;&ncy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy; &dcy;&ocy;&scy;&tcy;&ucy;&pcy; &kcy;&ocy; &vcy;&scy;&iecy;&mcy; &scy;&bcy;&ocy;&rcy;&kcy;&acy;&mcy;).</span></p> <p><span data-i18n="9f6cf5d01393cb55cd580f02b86e141fcb8328f7eb5fba019ab4be0469d87dbb/d4" data-source="There was a discussion at one point on the linux kernel mailing list of whether it was ok to always ask end user to bisect, and very good points were made to support the point of view that it is ok." onmousemove="i18n(this)">&Vcy; &kcy;&acy;&kcy;&ocy;&jcy;-&tcy;&ocy; &mcy;&ocy;&mcy;&iecy;&ncy;&tcy; &vcy; &scy;&pcy;&icy;&scy;&kcy;&iecy; &rcy;&acy;&scy;&scy;&ycy;&lcy;&kcy;&icy; &yacy;&dcy;&rcy;&acy; Linux &ocy;&bcy;&scy;&ucy;&zhcy;&dcy;&acy;&lcy;&ocy;&scy;&softcy;, &mcy;&ocy;&zhcy;&ncy;&ocy; &lcy;&icy; &vcy;&scy;&iecy;&gcy;&dcy;&acy; &pcy;&rcy;&ocy;&scy;&icy;&tcy;&softcy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;&gcy;&ocy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yacy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&icy;&tcy;&softcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &icy; &bcy;&ycy;&lcy;&icy; &vcy;&ycy;&scy;&kcy;&acy;&zcy;&acy;&ncy;&ycy; &ocy;&chcy;&iecy;&ncy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&iecy; &zcy;&acy;&mcy;&iecy;&chcy;&acy;&ncy;&icy;&yacy; &vcy; &pcy;&ocy;&dcy;&dcy;&iecy;&rcy;&zhcy;&kcy;&ucy; &tcy;&ocy;&chcy;&kcy;&icy; &zcy;&rcy;&iecy;&ncy;&icy;&yacy;, &chcy;&tcy;&ocy; &ecy;&tcy;&ocy; &ncy;&ocy;&rcy;&mcy;&acy;&lcy;&softcy;&ncy;&ocy;.</span></p> <p><span data-i18n="a1fe1d3dcce83d343d16665af5e3d20ffc871a733cbe11d21c6399ce23926787/9f" data-source="For example David Miller wrote &lt;a href=&quot;#6&quot;&gt;[6]&lt;/a&gt;:" onmousemove="i18n(this)">&Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &Dcy;&ecy;&vcy;&icy;&dcy; &Mcy;&icy;&lcy;&lcy;&iecy;&rcy; &ncy;&acy;&pcy;&icy;&scy;&acy;&lcy;  <a href="git-bisect-lk2009.html#6">[6]</a> :</span></p> <div> <blockquote> <p><span data-i18n="09c9268e4fd1431ff2824a9f09250d5349d40c66b6b92588bd20c0ddb18e1d4d/3d" data-source="What people don&amp;rsquo;t get is that this is a situation where the &amp;quot;end node principle&amp;quot; applies. When you have limited resources (here: developers) you don&amp;rsquo;t push the bulk of the burden upon them. Instead you push things out to the resource you have a lot of, the end nodes (here: users), so that the situation actually scales." onmousemove="i18n(this)">&CHcy;&iecy;&gcy;&ocy; &lcy;&yucy;&dcy;&icy; &ncy;&iecy; &pcy;&ocy;&ncy;&icy;&mcy;&acy;&yucy;&tcy;, &tcy;&acy;&kcy; &ecy;&tcy;&ocy; &tcy;&ocy;&gcy;&ocy;, &chcy;&tcy;&ocy; &vcy; &ecy;&tcy;&ocy;&jcy; &scy;&icy;&tcy;&ucy;&acy;&tscy;&icy;&icy; &pcy;&rcy;&icy;&mcy;&iecy;&ncy;&icy;&mcy;  &quot;end node principle&quot; . &Kcy;&ocy;&gcy;&dcy;&acy; &ucy; &vcy;&acy;&scy; &ocy;&gcy;&rcy;&acy;&ncy;&icy;&chcy;&iecy;&ncy;&ncy;&ycy;&iecy; &rcy;&iecy;&scy;&ucy;&rcy;&scy;&ycy; (&zcy;&dcy;&iecy;&scy;&softcy;: &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&icy;), &vcy;&ycy; &ncy;&iecy; &pcy;&iecy;&rcy;&iecy;&kcy;&lcy;&acy;&dcy;&ycy;&vcy;&acy;&iecy;&tcy;&iecy; &ncy;&acy; &ncy;&icy;&khcy; &bcy;&ocy;&lcy;&softcy;&shcy;&ucy;&yucy; &chcy;&acy;&scy;&tcy;&softcy; &bcy;&rcy;&iecy;&mcy;&iecy;&ncy;&icy;. &Vcy;&mcy;&iecy;&scy;&tcy;&ocy; &ecy;&tcy;&ocy;&gcy;&ocy; &vcy;&ycy; &pcy;&iecy;&rcy;&iecy;&dcy;&acy;&iecy;&tcy;&iecy; &dcy;&acy;&ncy;&ncy;&ycy;&iecy; &ncy;&acy; &rcy;&iecy;&scy;&ucy;&rcy;&scy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ocy;&gcy;&ocy; &ucy; &vcy;&acy;&scy; &mcy;&ncy;&ocy;&gcy;&ocy;, &ncy;&acy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ycy;&iecy; &ucy;&zcy;&lcy;&ycy; (&zcy;&dcy;&iecy;&scy;&softcy;: &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&icy;), &tcy;&acy;&kcy; &chcy;&tcy;&ocy; &scy;&icy;&tcy;&ucy;&acy;&tscy;&icy;&yacy; &dcy;&iecy;&jcy;&scy;&tcy;&vcy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy; &mcy;&acy;&scy;&shcy;&tcy;&acy;&bcy;&icy;&rcy;&ucy;&iecy;&tcy;&scy;&yacy;.</span></p> </blockquote> </div> <p><span data-i18n="37289d1f307d60ad4f970ff287957ca9b61a97639d26ca765a72749a83ec71ea/f1" data-source="This means that it is often &amp;quot;cheaper&amp;quot; if QA people or end users can do it." onmousemove="i18n(this)">&Ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &chcy;&acy;&scy;&tcy;&ocy; &ecy;&tcy;&ocy;  &quot;cheaper&quot; , &iecy;&scy;&lcy;&icy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&icy;&scy;&tcy;&ycy; &pcy;&ocy; &kcy;&ocy;&ncy;&tcy;&rcy;&ocy;&lcy;&yucy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&acy; &icy;&lcy;&icy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ycy;&iecy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &ecy;&tcy;&ocy; &scy;&dcy;&iecy;&lcy;&acy;&tcy;&softcy;.</span></p> <p><span data-i18n="e4d512535e9148c520b272aaa685c586140a8759959370344a38ff0e99e935b8/73" data-source="What is interesting too is that end users that are reporting bugs (or QA people that reproduced a bug) have access to the environment where the bug happens. So they can often more easily reproduce a regression. And if they can bisect, then more information will be extracted from the environment where the bug happens, which means that it will be easier to understand and then fix the bug." onmousemove="i18n(this)">&CHcy;&tcy;&ocy; &tcy;&acy;&kcy;&zhcy;&iecy; &icy;&ncy;&tcy;&iecy;&rcy;&iecy;&scy;&ncy;&ocy;, &tcy;&acy;&kcy; &ecy;&tcy;&ocy; &tcy;&ocy;, &chcy;&tcy;&ocy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ycy;&iecy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&icy;, &scy;&ocy;&ocy;&bcy;&shchcy;&acy;&yucy;&shchcy;&icy;&iecy; &ocy;&bcy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;&khcy; (&icy;&lcy;&icy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&icy;&scy;&tcy;&ycy; &pcy;&ocy; &kcy;&ocy;&ncy;&tcy;&rcy;&ocy;&lcy;&yucy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&acy;, &vcy;&ocy;&scy;&pcy;&rcy;&ocy;&icy;&zcy;&vcy;&iecy;&dcy;&shcy;&icy;&iecy; &ocy;&shcy;&icy;&bcy;&kcy;&ucy;), &icy;&mcy;&iecy;&yucy;&tcy; &dcy;&ocy;&scy;&tcy;&ucy;&pcy; &kcy; &scy;&rcy;&iecy;&dcy;&iecy;, &vcy; &kcy;&ocy;&tcy;&ocy;&rcy;&ocy;&jcy; &vcy;&ocy;&zcy;&ncy;&icy;&kcy;&acy;&iecy;&tcy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;. &Pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &icy;&mcy; &zcy;&acy;&chcy;&acy;&scy;&tcy;&ucy;&yucy; &lcy;&iecy;&gcy;&chcy;&iecy; &vcy;&ocy;&scy;&pcy;&rcy;&ocy;&icy;&zcy;&vcy;&iecy;&scy;&tcy;&icy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yucy;. &Acy; &iecy;&scy;&lcy;&icy; &ocy;&ncy;&icy; &scy;&mcy;&ocy;&gcy;&ucy;&tcy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&icy;&tcy;&softcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &tcy;&ocy; &icy;&zcy; &scy;&rcy;&iecy;&dcy;&ycy;, &gcy;&dcy;&iecy; &pcy;&rcy;&ocy;&icy;&zcy;&ocy;&shcy;&lcy;&acy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;, &bcy;&ucy;&dcy;&iecy;&tcy; &icy;&zcy;&vcy;&lcy;&iecy;&chcy;&iecy;&ncy;&ocy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&icy;, &acy; &ecy;&tcy;&ocy; &zcy;&ncy;&acy;&chcy;&icy;&tcy;, &chcy;&tcy;&ocy; &ocy;&shcy;&icy;&bcy;&kcy;&ucy; &bcy;&ucy;&dcy;&iecy;&tcy; &lcy;&iecy;&gcy;&chcy;&iecy; &pcy;&ocy;&ncy;&yacy;&tcy;&softcy;, &acy; &zcy;&acy;&tcy;&iecy;&mcy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&icy;&tcy;&softcy;.</span></p> <p><span data-i18n="6f8e1e54ce70b182687a51f29b87c9224d6a2cb5b96ac6c279b3bbf113c10773/ae" data-source="For open source projects it can be a good way to get more useful contributions from end users, and to introduce them to QA and development activities." onmousemove="i18n(this)">&Dcy;&lcy;&yacy; &pcy;&rcy;&ocy;&iecy;&kcy;&tcy;&ocy;&vcy; &scy; &ocy;&tcy;&kcy;&rcy;&ycy;&tcy;&ycy;&mcy; &icy;&scy;&khcy;&ocy;&dcy;&ncy;&ycy;&mcy; &kcy;&ocy;&dcy;&ocy;&mcy; &ecy;&tcy;&ocy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&mcy; &scy;&pcy;&ocy;&scy;&ocy;&bcy;&ocy;&mcy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy; &bcy;&ocy;&lcy;&iecy;&iecy; &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ycy;&jcy; &vcy;&kcy;&lcy;&acy;&dcy; &ocy;&tcy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ycy;&khcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&iecy;&jcy; &icy; &pcy;&ocy;&zcy;&ncy;&acy;&kcy;&ocy;&mcy;&icy;&tcy;&softcy; &icy;&khcy; &scy; &dcy;&iecy;&yacy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy;&scy;&tcy;&softcy;&yucy; &pcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yucy; &kcy;&acy;&chcy;&iecy;&scy;&tcy;&vcy;&acy; &icy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&iecy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_using_complex_scripts"><span data-i18n="a59a9f0c71aa45d28be782ce78a513700a196ffb379ca7cb88696590d4de1542/3a" data-source="Using complex scripts" onmousemove="i18n(this)">&Icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; &scy;&lcy;&ocy;&zhcy;&ncy;&ycy;&khcy; &scy;&kcy;&rcy;&icy;&pcy;&tcy;&ocy;&vcy;</span></h3> <p><span data-i18n="4fffb472657a14e05f0f4bc333ee91eca59ccca8da1c24d7a527ae1acc1f731e/a0" data-source="In some cases like for kernel development it can be worth developing complex scripts to be able to fully automate bisecting." onmousemove="i18n(this)">&Vcy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy; &scy;&lcy;&ucy;&chcy;&acy;&yacy;&khcy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy; &pcy;&rcy;&icy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&iecy; &yacy;&dcy;&rcy;&acy;, &mcy;&ocy;&zhcy;&iecy;&tcy; &ocy;&kcy;&acy;&zcy;&acy;&tcy;&softcy;&scy;&yacy; &tscy;&iecy;&lcy;&iecy;&scy;&ocy;&ocy;&bcy;&rcy;&acy;&zcy;&ncy;&ycy;&mcy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&acy;&tcy;&softcy; &scy;&lcy;&ocy;&zhcy;&ncy;&ycy;&iecy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&icy;, &chcy;&tcy;&ocy;&bcy;&ycy; &icy;&mcy;&iecy;&tcy;&softcy; &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy;&scy;&tcy;&softcy; &pcy;&ocy;&lcy;&ncy;&ocy;&scy;&tcy;&softcy;&yucy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;.</span></p> <p><span data-i18n="beeb8f6c72ff6699b40f7cc41bdb2a8cee33201151a8f6e51f2c1e797b2c18c4/5f" data-source="Here is what Ingo Molnar says about that &lt;a href=&quot;#7&quot;&gt;[7]&lt;/a&gt;:" onmousemove="i18n(this)">&Vcy;&ocy;&tcy; &chcy;&tcy;&ocy; &gcy;&ocy;&vcy;&ocy;&rcy;&icy;&tcy; &Icy;&ncy;&gcy;&ocy; &Mcy;&ocy;&lcy;&ncy;&acy;&rcy; &ocy;&bcy; &ecy;&tcy;&ocy;&mcy;  <a href="git-bisect-lk2009.html#7">[7]</a> :</span></p> <div> <blockquote> <p><span data-i18n="cd97457c9290f68032b33ad7ede983a258b901c81978aee04dfb67e72edc9611/26" data-source="i have a fully automated bootup-hang bisection script. It is based on &amp;quot;git-bisect run&amp;quot;. I run the script, it builds and boots kernels fully automatically, and when the bootup fails (the script notices that via the serial log, which it continuously watches - or via a timeout, if the system does not come up within 10 minutes it&amp;rsquo;s a &amp;quot;bad&amp;quot; kernel), the script raises my attention via a beep and i power cycle the test box. (yeah, i should make use of a managed power outlet to 100% automate it)" onmousemove="i18n(this)">&Ucy; &mcy;&iecy;&ncy;&yacy; &iecy;&scy;&tcy;&softcy; &pcy;&ocy;&lcy;&ncy;&ocy;&scy;&tcy;&softcy;&yucy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&ncy;&ycy;&jcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy; &zcy;&acy;&gcy;&rcy;&ucy;&zcy;&kcy;&icy; &icy; &zcy;&acy;&vcy;&icy;&scy;&acy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;. &Ocy;&ncy; &ocy;&scy;&ncy;&ocy;&vcy;&acy;&ncy; &ncy;&acy;  &quot;git-bisect run&quot; . &Zcy;&acy;&pcy;&ucy;&scy;&kcy;&acy;&yucy; &scy;&kcy;&rcy;&icy;&pcy;&tcy;, &ocy;&ncy; &scy;&ocy;&bcy;&icy;&rcy;&acy;&iecy;&tcy; &icy; &zcy;&acy;&gcy;&rcy;&ucy;&zhcy;&acy;&iecy;&tcy; &yacy;&dcy;&rcy;&acy; &pcy;&ocy;&lcy;&ncy;&ocy;&scy;&tcy;&softcy;&yucy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;, &acy; &kcy;&ocy;&gcy;&dcy;&acy; &zcy;&acy;&gcy;&rcy;&ucy;&zcy;&kcy;&acy; &ncy;&iecy; &ucy;&dcy;&acy;&lcy;&acy;&scy;&softcy; (&scy;&kcy;&rcy;&icy;&pcy;&tcy; &zcy;&acy;&mcy;&iecy;&chcy;&acy;&iecy;&tcy; &ecy;&tcy;&ocy; &chcy;&iecy;&rcy;&iecy;&zcy; &pcy;&ocy;&scy;&lcy;&iecy;&dcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&softcy;&ncy;&ycy;&jcy; &zhcy;&ucy;&rcy;&ncy;&acy;&lcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &pcy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&ncy;&ocy; &pcy;&rcy;&ocy;&scy;&mcy;&acy;&tcy;&rcy;&icy;&vcy;&acy;&iecy;&tcy; - &icy;&lcy;&icy; &chcy;&iecy;&rcy;&iecy;&zcy; &tcy;&acy;&jcy;&mcy;&acy;&ucy;&tcy;, &iecy;&scy;&lcy;&icy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&acy; &ncy;&iecy; &zcy;&acy;&pcy;&ucy;&scy;&kcy;&acy;&iecy;&tcy;&scy;&yacy; &vcy; &tcy;&iecy;&chcy;&iecy;&ncy;&icy;&iecy; 10 &mcy;&icy;&ncy;&ucy;&tcy; - &ecy;&tcy;&ocy;  &quot;bad&quot; ), &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy; &pcy;&rcy;&icy;&vcy;&lcy;&iecy;&kcy;&acy;&iecy;&tcy; &mcy;&ocy;&iecy; &vcy;&ncy;&icy;&mcy;&acy;&ncy;&icy;&iecy; &zcy;&vcy;&ucy;&kcy;&ocy;&vcy;&ycy;&mcy; &scy;&icy;&gcy;&ncy;&acy;&lcy;&ocy;&mcy;, &icy; &yacy; &vcy;&kcy;&lcy;&yucy;&chcy;&acy;&yucy; &icy; &vcy;&kcy;&lcy;&yucy;&chcy;&acy;&yucy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&jcy; &bcy;&lcy;&ocy;&kcy;. (&dcy;&acy;, &mcy;&ncy;&iecy; &scy;&lcy;&iecy;&dcy;&ucy;&iecy;&tcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &ucy;&pcy;&rcy;&acy;&vcy;&lcy;&yacy;&iecy;&mcy;&ucy;&yucy; &rcy;&ocy;&zcy;&iecy;&tcy;&kcy;&ucy;, &chcy;&tcy;&ocy;&bcy;&ycy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &iecy;&iecy; &ncy;&acy; 100%)</span></p> </blockquote> </div> </div> <div> <h3 class="text-body-emphasis"  id="_combining_test_suites_git_bisect_and_other_systems_together"><span data-i18n="0430693a0b22b0ad2479691a75673813061664ec24cdbff15f1e1a3ab81af73f/3b" data-source="Combining test suites, git bisect and other systems together" onmousemove="i18n(this)">&Ocy;&bcy;&hardcy;&iecy;&dcy;&icy;&ncy;&iecy;&ncy;&icy;&iecy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;&ycy;&khcy; &ncy;&acy;&bcy;&ocy;&rcy;&ocy;&vcy;,  git  bisect &icy; &dcy;&rcy;&ucy;&gcy;&icy;&khcy; &scy;&icy;&scy;&tcy;&iecy;&mcy; &vcy;&mcy;&iecy;&scy;&tcy;&iecy;</span></h3> <p><span data-i18n="ae16d325b258f804d490e4723e4d440e000b20b6d53850176f2b3ce16ac7b262/93" data-source="We have seen that test suites and git bisect are very powerful when used together. It can be even more powerful if you can combine them with other systems." onmousemove="i18n(this)">&Mcy;&ycy; &vcy;&icy;&dcy;&iecy;&lcy;&icy;, &chcy;&tcy;&ocy; &ncy;&acy;&bcy;&ocy;&rcy;&ycy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &icy;  git  bisect &ocy;&chcy;&iecy;&ncy;&softcy; &ecy;&fcy;&fcy;&iecy;&kcy;&tcy;&icy;&vcy;&ncy;&ycy; &pcy;&rcy;&icy; &scy;&ocy;&vcy;&mcy;&iecy;&scy;&tcy;&ncy;&ocy;&mcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&icy;. &Ecy;&tcy;&ocy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &iecy;&shchcy;&iecy; &bcy;&ocy;&lcy;&iecy;&iecy; &mcy;&ocy;&shchcy;&ncy;&ycy;&mcy;, &iecy;&scy;&lcy;&icy; &vcy;&ycy; &scy;&mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &ocy;&bcy;&hardcy;&iecy;&dcy;&icy;&ncy;&icy;&tcy;&softcy; &icy;&khcy; &scy; &dcy;&rcy;&ucy;&gcy;&icy;&mcy;&icy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&acy;&mcy;&icy;.</span></p> <p><span data-i18n="c97d55e3a53fff149499b19b960b63c07ff60e877a858112c902e2209e3b6b82/b1" data-source="For example some test suites could be run automatically at night with some unusual (or even random) configurations. And if a regression is found by a test suite, then &amp;quot;git bisect&amp;quot; can be automatically launched, and its result can be emailed to the author of the first bad commit found by &amp;quot;git bisect&amp;quot;, and perhaps other people too. And a new entry in the bug tracking system could be automatically created too." onmousemove="i18n(this)">&Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ncy;&acy;&bcy;&ocy;&rcy;&ycy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &mcy;&ocy;&gcy;&ucy;&tcy; &zcy;&acy;&pcy;&ucy;&scy;&kcy;&acy;&tcy;&softcy;&scy;&yacy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &ncy;&ocy;&chcy;&softcy;&yucy; &scy; &ncy;&iecy;&ocy;&bcy;&ycy;&chcy;&ncy;&ycy;&mcy;&icy; (&icy;&lcy;&icy; &dcy;&acy;&zhcy;&iecy; &scy;&lcy;&ucy;&chcy;&acy;&jcy;&ncy;&ycy;&mcy;&icy;) &kcy;&ocy;&ncy;&fcy;&icy;&gcy;&ucy;&rcy;&acy;&tscy;&icy;&yacy;&mcy;&icy;. &Acy; &iecy;&scy;&lcy;&icy; &ncy;&acy;&bcy;&ocy;&rcy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy; &ocy;&bcy;&ncy;&acy;&rcy;&ucy;&zhcy;&icy;&tcy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yucy;, &tcy;&ocy;  &quot;git bisect&quot;  &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &zcy;&acy;&pcy;&ucy;&shchcy;&iecy;&ncy;, &acy; &iecy;&gcy;&ocy; &rcy;&iecy;&zcy;&ucy;&lcy;&softcy;&tcy;&acy;&tcy; &mcy;&ocy;&zhcy;&ncy;&ocy; &ocy;&tcy;&pcy;&rcy;&acy;&vcy;&icy;&tcy;&softcy; &pcy;&ocy; &ecy;&lcy;&iecy;&kcy;&tcy;&rcy;&ocy;&ncy;&ncy;&ocy;&jcy; &pcy;&ocy;&chcy;&tcy;&iecy; &acy;&vcy;&tcy;&ocy;&rcy;&ucy; &pcy;&iecy;&rcy;&vcy;&ocy;&gcy;&ocy; &pcy;&lcy;&ocy;&khcy;&ocy;&gcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;, &ncy;&acy;&jcy;&dcy;&iecy;&ncy;&ncy;&ocy;&gcy;&ocy;  &quot;git bisect&quot; , &acy; &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy;, &icy; &dcy;&rcy;&ucy;&gcy;&icy;&mcy; &lcy;&yucy;&dcy;&yacy;&mcy;. &Kcy;&rcy;&ocy;&mcy;&iecy; &tcy;&ocy;&gcy;&ocy;, &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &scy;&ocy;&zcy;&dcy;&acy;&ncy;&acy; &ncy;&ocy;&vcy;&acy;&yacy; &zcy;&acy;&pcy;&icy;&scy;&softcy; &vcy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&iecy; &ocy;&tcy;&scy;&lcy;&iecy;&zhcy;&icy;&vcy;&acy;&ncy;&icy;&yacy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;.</span></p> </div> </div> <h2 class="text-body-emphasis"  id="_the_future_of_bisecting"><span data-i18n="3538f93af70d72c3df73ad46582b55680a69db8f4f6050d1604e78cdefacdb2c/8f" data-source="The future of bisecting" onmousemove="i18n(this)">&Bcy;&ucy;&dcy;&ucy;&shchcy;&iecy;&iecy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;</span></h2> <div> <div> <h3 class="text-body-emphasis"  id="_git_replace"><span data-i18n="4bdc609b4f971c7dad33a43babbb3bb2ac30ece2c06b4b24de1070ce87e3d56a/e4" data-source="&amp;quot;git replace&amp;quot;" onmousemove="i18n(this)">&quot;git replace&quot;</span></h3> <p><span data-i18n="f0c7bf61ac5f3e4cd6f7a3819971617401557c4d226c4411565867d39fe688a1/86" data-source="We saw earlier that &amp;quot;git bisect skip&amp;quot; is now using a PRNG to try to avoid areas in the commit graph where commits are untestable. The problem is that sometimes the first bad commit will be in an untestable area." onmousemove="i18n(this)">&Rcy;&acy;&ncy;&iecy;&iecy; &mcy;&ycy; &vcy;&icy;&dcy;&iecy;&lcy;&icy;, &chcy;&tcy;&ocy;  &quot;git bisect skip&quot;  &tcy;&iecy;&pcy;&iecy;&rcy;&softcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy; PRNG, &chcy;&tcy;&ocy;&bcy;&ycy; &icy;&zcy;&bcy;&iecy;&zhcy;&acy;&tcy;&softcy; &ocy;&bcy;&lcy;&acy;&scy;&tcy;&iecy;&jcy; &vcy; &gcy;&rcy;&acy;&fcy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy;, &gcy;&dcy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &ncy;&iecy;&vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy; &pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&icy;&tcy;&softcy;. &Pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&acy; &vcy; &tcy;&ocy;&mcy;, &chcy;&tcy;&ocy; &icy;&ncy;&ocy;&gcy;&dcy;&acy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &ocy;&kcy;&acy;&zcy;&ycy;&vcy;&acy;&iecy;&tcy;&scy;&yacy; &vcy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ocy;&jcy; &ocy;&bcy;&lcy;&acy;&scy;&tcy;&icy;.</span></p> <p><span data-i18n="807031d020d69a9dae7dcc093318caa78c28a544b4e7543fefd1ae31c09fa89d/88" data-source="To simplify the discussion we will suppose that the untestable area is a simple string of commits and that it was created by a breakage introduced by one commit (let&amp;rsquo;s call it BBC for bisect breaking commit) and later fixed by another one (let&amp;rsquo;s call it BFC for bisect fixing commit)." onmousemove="i18n(this)">&CHcy;&tcy;&ocy;&bcy;&ycy; &ucy;&pcy;&rcy;&ocy;&scy;&tcy;&icy;&tcy;&softcy; &ocy;&bcy;&scy;&ucy;&zhcy;&dcy;&iecy;&ncy;&icy;&iecy;, &mcy;&ycy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&ocy;&zhcy;&icy;&mcy;, &chcy;&tcy;&ocy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&acy;&yacy; &ocy;&bcy;&lcy;&acy;&scy;&tcy;&softcy; &pcy;&rcy;&iecy;&dcy;&scy;&tcy;&acy;&vcy;&lcy;&yacy;&iecy;&tcy; &scy;&ocy;&bcy;&ocy;&jcy; &pcy;&rcy;&ocy;&scy;&tcy;&ucy;&yucy; &scy;&tcy;&rcy;&ocy;&kcy;&ucy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &icy; &chcy;&tcy;&ocy; &ocy;&ncy;&acy; &bcy;&ycy;&lcy;&acy; &scy;&ocy;&zcy;&dcy;&acy;&ncy;&acy; &vcy; &rcy;&iecy;&zcy;&ucy;&lcy;&softcy;&tcy;&acy;&tcy;&iecy; &ncy;&acy;&rcy;&ucy;&shcy;&iecy;&ncy;&icy;&yacy;, &vcy;&ycy;&zcy;&vcy;&acy;&ncy;&ncy;&ocy;&gcy;&ocy; &ocy;&dcy;&ncy;&icy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy; (&ncy;&acy;&zcy;&ocy;&vcy;&iecy;&mcy; &iecy;&gcy;&ocy; BBC &dcy;&lcy;&yacy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&icy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;), &acy; &zcy;&acy;&tcy;&iecy;&mcy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&ocy; &dcy;&rcy;&ucy;&gcy;&icy;&mcy; (&ncy;&acy;&zcy;&ocy;&vcy;&iecy;&mcy; &iecy;&gcy;&ocy; BFC). &dcy;&lcy;&yacy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&icy; &fcy;&icy;&kcy;&scy;&acy;&tscy;&icy;&icy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;).</span></p> <p><span data-i18n="652744a2ab28954bbafd780fd76c15c2bd557594532f907f10ead1989727af95/0f" data-source="For example:" onmousemove="i18n(this)">For example:</span></p> <div> <div> <pre class="hljs language-undefined">...-Y-BBC-X1-X2-X3-X4-X5-X6-BFC-Z-...</pre> </div> </div> <p><span data-i18n="0fe89efab2a37599ff87315ecc60b93ea9b99b18799d5815eca66e55ad4dec82/53" data-source="where we know that Y is good and BFC is bad, and where BBC and X1 to X6 are untestable." onmousemove="i18n(this)">&gcy;&dcy;&iecy; &mcy;&ycy; &zcy;&ncy;&acy;&iecy;&mcy;, &chcy;&tcy;&ocy; Y &mdash; &khcy;&ocy;&rcy;&ocy;&shcy;&ocy;, &acy; BFC &mdash; &pcy;&lcy;&ocy;&khcy;&ocy;, &icy; &gcy;&dcy;&iecy; BBC &icy; X1&ndash;X6 &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;.</span></p> <p><span data-i18n="bc9014c8bb1cd465a7eec834d904e18d3ac7289f51f99e00bfded6d0d1ef9c8b/aa" data-source="In this case if you are bisecting manually, what you can do is create a special branch that starts just before the BBC. The first commit in this branch should be the BBC with the BFC squashed into it. And the other commits in the branch should be the commits between BBC and BFC rebased on the first commit of the branch and then the commit after BFC also rebased on." onmousemove="i18n(this)">&Vcy; &ecy;&tcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;, &iecy;&scy;&lcy;&icy; &vcy;&ycy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&yacy;&iecy;&tcy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &vcy;&rcy;&ucy;&chcy;&ncy;&ucy;&yucy;, &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &scy;&ocy;&zcy;&dcy;&acy;&tcy;&softcy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ucy;&yucy; &vcy;&iecy;&tcy;&kcy;&ucy;, &kcy;&ocy;&tcy;&ocy;&rcy;&acy;&yacy; &ncy;&acy;&chcy;&icy;&ncy;&acy;&iecy;&tcy;&scy;&yacy; &ncy;&iecy;&pcy;&ocy;&scy;&rcy;&iecy;&dcy;&scy;&tcy;&vcy;&iecy;&ncy;&ncy;&ocy; &pcy;&iecy;&rcy;&iecy;&dcy; BBC. &Pcy;&iecy;&rcy;&vcy;&ycy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&mcy; &vcy; &ecy;&tcy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&iecy; &dcy;&ocy;&lcy;&zhcy;&iecy;&ncy; &bcy;&ycy;&tcy;&softcy; BBC &scy; &vcy;&tcy;&icy;&scy;&ncy;&ucy;&tcy;&ycy;&mcy; &vcy; &ncy;&iecy;&gcy;&ocy; BFC. &Acy; &dcy;&rcy;&ucy;&gcy;&icy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &vcy; &vcy;&iecy;&tcy;&kcy;&iecy; &dcy;&ocy;&lcy;&zhcy;&ncy;&ycy; &bcy;&ycy;&tcy;&softcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&mcy;&icy; &mcy;&iecy;&zhcy;&dcy;&ucy; BBC &icy; BFC, &pcy;&iecy;&rcy;&iecy;&bcy;&acy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&ncy;&ycy;&mcy;&icy; &ncy;&acy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &vcy;&iecy;&tcy;&kcy;&icy;, &acy; &zcy;&acy;&tcy;&iecy;&mcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &pcy;&ocy;&scy;&lcy;&iecy; &tcy;&ocy;&gcy;&ocy;, &kcy;&acy;&kcy; BFC &tcy;&acy;&kcy;&zhcy;&iecy; &bcy;&ycy;&lcy; &pcy;&iecy;&rcy;&iecy;&bcy;&acy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;.</span></p> <p><span data-i18n="652744a2ab28954bbafd780fd76c15c2bd557594532f907f10ead1989727af95/0f" data-source="For example:" onmousemove="i18n(this)">For example:</span></p> <div> <div> <pre class="hljs language-bash">      (BBC+BFC)-X1<span class="hljs-string">&apos;-X2&apos;</span>-X3<span class="hljs-string">&apos;-X4&apos;</span>-X5<span class="hljs-string">&apos;-X6&apos;</span>-Z<span class="hljs-string">&apos;
     /
...-Y-BBC-X1-X2-X3-X4-X5-X6-BFC-Z-...</span></pre> </div> </div> <p><span data-i18n="2c2d48f9fc5deedf15e2c08861f2894aa4c49e1fbc049cafa95cd7d888d719f1/6e" data-source="where commits quoted with &amp;apos; have been rebased." onmousemove="i18n(this)">&gcy;&dcy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy;, &tscy;&icy;&tcy;&icy;&rcy;&ucy;&iecy;&mcy;&ycy;&iecy; &scy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy;&yucy; &apos;, &bcy;&ycy;&lcy;&icy; &pcy;&iecy;&rcy;&iecy;&bcy;&acy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&ycy;.</span></p> <p><span data-i18n="690595dcb9b6d692abba3bad672724243ab845d9c59cdd814aa16fd9f01b7104/ea" data-source="You can easily create such a branch with Git using interactive rebase." onmousemove="i18n(this)">&Vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &lcy;&iecy;&gcy;&kcy;&ocy; &scy;&ocy;&zcy;&dcy;&acy;&tcy;&softcy; &tcy;&acy;&kcy;&ucy;&yucy; &ZeroWidthSpace;&ZeroWidthSpace;&vcy;&iecy;&tcy;&kcy;&ucy; &scy;  Git , &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yacy; &icy;&ncy;&tcy;&iecy;&rcy;&acy;&kcy;&tcy;&icy;&vcy;&ncy;&ocy;&iecy; &pcy;&iecy;&rcy;&iecy;&bcy;&acy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy;.</span></p> <p><span data-i18n="23f01467be18ef44c90fc84bc20cb25880e1eb67774a768e1deae161cd48003c/5c" data-source="For example using:" onmousemove="i18n(this)">&Ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yacy;:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git rebase -i Y Z</pre> </div> </div> <p><span data-i18n="12aa1083ebf314fdda378a6d059051f326479c85ee2a5f688375d321241f0dc2/91" data-source="and then moving BFC after BBC and squashing it." onmousemove="i18n(this)">&acy; &zcy;&acy;&tcy;&iecy;&mcy; &pcy;&iecy;&rcy;&iecy;&mcy;&iecy;&scy;&tcy;&icy;&lcy; BFC &pcy;&ocy;&scy;&lcy;&iecy; BBC &icy; &rcy;&acy;&zcy;&dcy;&acy;&vcy;&icy;&lcy; &iecy;&gcy;&ocy;.</span></p> <p><span data-i18n="7706cd14cf61154d72e1d67aa5c39387d96d930645d45ae5aeb4a93436f5ac38/01" data-source="After that you can start bisecting as usual in the new branch and you should eventually find the first bad commit." onmousemove="i18n(this)">&Pcy;&ocy;&scy;&lcy;&iecy; &ecy;&tcy;&ocy;&gcy;&ocy; &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &ncy;&acy;&chcy;&acy;&tcy;&softcy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &vcy; &ncy;&ocy;&vcy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&iecy;, &kcy;&acy;&kcy; &ocy;&bcy;&ycy;&chcy;&ncy;&ocy;, &icy; &vcy; &kcy;&ocy;&ncy;&iecy;&chcy;&ncy;&ocy;&mcy; &icy;&tcy;&ocy;&gcy;&iecy; &vcy;&ycy; &dcy;&ocy;&lcy;&zhcy;&ncy;&ycy; &ncy;&acy;&jcy;&tcy;&icy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;.</span></p> <p><span data-i18n="652744a2ab28954bbafd780fd76c15c2bd557594532f907f10ead1989727af95/0f" data-source="For example:" onmousemove="i18n(this)">For example:</span></p> <div> <div> <pre class="hljs language-ruby"><span class="hljs-variable">$ </span>git bisect start Z<span class="hljs-string">&apos; Y</span></pre> </div> </div> <p><span data-i18n="b2e861eea70e63fe46ae10d0321995871dbdab4f28f509bd4a83299e1c7b24c4/82" data-source="If you are using &amp;quot;git bisect run&amp;quot;, you can use the same manual fix up as above, and then start another &amp;quot;git bisect run&amp;quot; in the special branch. Or as the &amp;quot;git bisect&amp;quot; man page says, the script passed to &amp;quot;git bisect run&amp;quot; can apply a patch before it compiles and test the software &lt;a href=&quot;#8&quot;&gt;[8]&lt;/a&gt;. The patch should turn a current untestable commits into a testable one. So the testing will result in &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot; and &amp;quot;git bisect&amp;quot; will be able to find the first bad commit. And the script should not forget to remove the patch once the testing is done before exiting from the script." onmousemove="i18n(this)">&IEcy;&scy;&lcy;&icy; &vcy;&ycy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy;&iecy;  &quot;git bisect run&quot; , &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &tcy;&ocy; &zhcy;&iecy; &rcy;&ucy;&chcy;&ncy;&ocy;&iecy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&iecy;, &chcy;&tcy;&ocy; &icy; &vcy;&ycy;&shcy;&iecy;, &acy; &zcy;&acy;&tcy;&iecy;&mcy; &zcy;&acy;&pcy;&ucy;&scy;&tcy;&icy;&tcy;&softcy; &dcy;&rcy;&ucy;&gcy;&ocy;&jcy;  &quot;git bisect run&quot;  &vcy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&iecy;. &Icy;&lcy;&icy;, &kcy;&acy;&kcy; &scy;&kcy;&acy;&zcy;&acy;&ncy;&ocy; &ncy;&acy; &scy;&tcy;&rcy;&acy;&ncy;&icy;&tscy;&iecy; &rcy;&ucy;&kcy;&ocy;&vcy;&ocy;&dcy;&scy;&tcy;&vcy;&acy;  &quot;git bisect&quot; , &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy;, &pcy;&iecy;&rcy;&iecy;&dcy;&acy;&ncy;&ncy;&ycy;&jcy;  &quot;git bisect run&quot; , &mcy;&ocy;&zhcy;&iecy;&tcy; &pcy;&rcy;&icy;&mcy;&iecy;&ncy;&icy;&tcy;&softcy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&iecy;&rcy;&iecy;&dcy; &kcy;&ocy;&mcy;&pcy;&icy;&lcy;&yacy;&tscy;&icy;&iecy;&jcy; &icy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy;&mcy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&bcy;&iecy;&scy;&pcy;&iecy;&chcy;&iecy;&ncy;&icy;&yacy;  <a href="git-bisect-lk2009.html#8">[8]</a> . &Pcy;&acy;&tcy;&chcy; &dcy;&ocy;&lcy;&zhcy;&iecy;&ncy; &pcy;&rcy;&iecy;&vcy;&rcy;&acy;&tcy;&icy;&tcy;&softcy; &tcy;&iecy;&kcy;&ucy;&shchcy;&icy;&iecy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&iecy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; &vcy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ucy;&iecy;&mcy;&ycy;&iecy;. &Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; &pcy;&rcy;&icy;&vcy;&iecy;&dcy;&iecy;&tcy; &kcy;  &quot;good&quot;  &icy;&lcy;&icy;  &quot;bad&quot; , &acy;  &quot;git bisect&quot;  &scy;&mcy;&ocy;&zhcy;&iecy;&tcy; &ncy;&acy;&jcy;&tcy;&icy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy; &pcy;&lcy;&ocy;&khcy;&ocy;&jcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;. &Icy; &scy;&kcy;&rcy;&icy;&pcy;&tcy; &ncy;&iecy; &dcy;&ocy;&lcy;&zhcy;&iecy;&ncy; &zcy;&acy;&bcy;&ycy;&tcy;&softcy; &ucy;&dcy;&acy;&lcy;&icy;&tcy;&softcy; &pcy;&acy;&tcy;&chcy; &pcy;&ocy;&scy;&lcy;&iecy; &zcy;&acy;&vcy;&iecy;&rcy;&shcy;&iecy;&ncy;&icy;&yacy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; &pcy;&iecy;&rcy;&iecy;&dcy; &vcy;&ycy;&khcy;&ocy;&dcy;&ocy;&mcy; &icy;&zcy; &scy;&kcy;&rcy;&icy;&pcy;&tcy;&acy;.</span></p> <p><span data-i18n="33ffcf1d22870a4e5b32df4f4e90cf0d1966982c77b9be2364ca92836c62695c/0b" data-source="(Note that instead of a patch you can use &amp;quot;git cherry-pick BFC&amp;quot; to apply the fix, and in this case you should use &amp;quot;git reset --hard HEAD^&amp;quot; to revert the cherry-pick after testing and before returning from the script.)" onmousemove="i18n(this)">(&Ocy;&bcy;&rcy;&acy;&tcy;&icy;&tcy;&iecy; &vcy;&ncy;&icy;&mcy;&acy;&ncy;&icy;&iecy;, &chcy;&tcy;&ocy; &vcy;&mcy;&iecy;&scy;&tcy;&ocy; &pcy;&acy;&tcy;&chcy;&acy; &vcy;&ycy; &mcy;&ocy;&zhcy;&iecy;&tcy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;  &quot;git cherry-pick BFC&quot;  &dcy;&lcy;&yacy; &pcy;&rcy;&icy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&yacy;, &icy; &vcy; &ecy;&tcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy; &vcy;&acy;&mcy; &scy;&lcy;&iecy;&dcy;&ucy;&iecy;&tcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;  &quot;git reset --hard HEAD^&quot;  &dcy;&lcy;&yacy; &ocy;&tcy;&mcy;&iecy;&ncy;&ycy; &vcy;&ycy;&bcy;&ocy;&rcy;&acy; &vcy;&icy;&shcy;&ncy;&icy; &pcy;&ocy;&scy;&lcy;&iecy; &tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&yacy; &icy; &pcy;&iecy;&rcy;&iecy;&dcy; &vcy;&ocy;&zcy;&vcy;&rcy;&acy;&tcy;&ocy;&mcy; &icy;&zcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&yacy;.)</span></p> <p><span data-i18n="eab00194bf204751b4aa017d4299960ddb9c8ea86227e10b2abecf66870768fb/1c" data-source="But the above ways to work around untestable areas are a little bit clunky. Using special branches is nice because these branches can be shared by developers like usual branches, but the risk is that people will get many such branches. And it disrupts the normal &amp;quot;git bisect&amp;quot; work-flow. So, if you want to use &amp;quot;git bisect run&amp;quot; completely automatically, you have to add special code in your script to restart bisection in the special branches." onmousemove="i18n(this)">&Ncy;&ocy; &ocy;&pcy;&icy;&scy;&acy;&ncy;&ncy;&ycy;&iecy; &vcy;&ycy;&shcy;&iecy; &scy;&pcy;&ocy;&scy;&ocy;&bcy;&ycy; &ocy;&bcy;&ocy;&jcy;&tcy;&icy; &ncy;&iecy;&pcy;&rcy;&ocy;&vcy;&iecy;&rcy;&yacy;&iecy;&mcy;&ycy;&iecy; &ocy;&bcy;&lcy;&acy;&scy;&tcy;&icy; &ncy;&iecy;&mcy;&ncy;&ocy;&gcy;&ocy; &ncy;&iecy;&ucy;&kcy;&lcy;&yucy;&zhcy;&icy;. &Icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&khcy; &vcy;&iecy;&tcy;&ocy;&kcy; &ucy;&dcy;&ocy;&bcy;&ncy;&ocy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &ecy;&tcy;&icy; &vcy;&iecy;&tcy;&kcy;&icy; &scy;&ocy;&vcy;&mcy;&iecy;&scy;&tcy;&ncy;&ocy;, &kcy;&acy;&kcy; &ocy;&bcy;&ycy;&chcy;&ncy;&ycy;&iecy; &vcy;&iecy;&tcy;&kcy;&icy;, &ncy;&ocy; &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy; &rcy;&icy;&scy;&kcy;, &chcy;&tcy;&ocy; &lcy;&yucy;&dcy;&icy; &pcy;&ocy;&lcy;&ucy;&chcy;&acy;&tcy; &mcy;&ncy;&ocy;&gcy;&ocy; &tcy;&acy;&kcy;&icy;&khcy; &vcy;&iecy;&tcy;&ocy;&kcy;. &Icy; &ecy;&tcy;&ocy; &ncy;&acy;&rcy;&ucy;&shcy;&acy;&iecy;&tcy; &ncy;&ocy;&rcy;&mcy;&acy;&lcy;&softcy;&ncy;&ycy;&jcy; &rcy;&acy;&bcy;&ocy;&chcy;&icy;&jcy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;  &quot;git bisect&quot; . &Icy;&tcy;&acy;&kcy;, &iecy;&scy;&lcy;&icy; &vcy;&ycy; &khcy;&ocy;&tcy;&icy;&tcy;&iecy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;  &quot;git bisect run&quot;  &pcy;&ocy;&lcy;&ncy;&ocy;&scy;&tcy;&softcy;&yucy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;, &vcy;&acy;&mcy; &ncy;&iecy;&ocy;&bcy;&khcy;&ocy;&dcy;&icy;&mcy;&ocy; &dcy;&ocy;&bcy;&acy;&vcy;&icy;&tcy;&softcy; &vcy; &scy;&vcy;&ocy;&jcy; &scy;&kcy;&rcy;&icy;&pcy;&tcy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&jcy; &kcy;&ocy;&dcy; &dcy;&lcy;&yacy; &pcy;&iecy;&rcy;&iecy;&zcy;&acy;&pcy;&ucy;&scy;&kcy;&acy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &vcy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&khcy; &vcy;&iecy;&tcy;&kcy;&acy;&khcy;.</span></p> <p><span data-i18n="097e32ca6148df718ece9330bd445a20fd6874c501fea8bab76cb5ecb982ed27/04" data-source="Anyway one can notice in the above special branch example that the Z&amp;apos; and Z commits should point to the same source code state (the same &amp;quot;tree&amp;quot; in git parlance). That&amp;rsquo;s because Z&amp;apos; result from applying the same changes as Z just in a slightly different order." onmousemove="i18n(this)">&Vcy; &lcy;&yucy;&bcy;&ocy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy;, &vcy; &pcy;&rcy;&icy;&vcy;&iecy;&dcy;&iecy;&ncy;&ncy;&ocy;&mcy; &vcy;&ycy;&shcy;&iecy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&iecy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ocy;&jcy; &vcy;&iecy;&tcy;&kcy;&icy; &mcy;&ocy;&zhcy;&ncy;&ocy; &zcy;&acy;&mcy;&iecy;&tcy;&icy;&tcy;&softcy;, &chcy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ycy; Z&apos; &icy; Z &dcy;&ocy;&lcy;&zhcy;&ncy;&ycy; &ucy;&kcy;&acy;&zcy;&ycy;&vcy;&acy;&tcy;&softcy; &ncy;&acy; &ocy;&dcy;&ncy;&ocy; &icy; &tcy;&ocy; &zhcy;&iecy; &scy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&icy;&iecy; &icy;&scy;&khcy;&ocy;&dcy;&ncy;&ocy;&gcy;&ocy; &kcy;&ocy;&dcy;&acy; (&tcy;&ocy;&tcy; &zhcy;&iecy;  &quot;tree&quot;  &ncy;&acy; &yacy;&zcy;&ycy;&kcy;&iecy;  git ). &Ecy;&tcy;&ocy; &pcy;&ocy;&tcy;&ocy;&mcy;&ucy;, &chcy;&tcy;&ocy; Z&apos; &yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &rcy;&iecy;&zcy;&ucy;&lcy;&softcy;&tcy;&acy;&tcy;&ocy;&mcy; &pcy;&rcy;&icy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy; &tcy;&iecy;&khcy; &zhcy;&iecy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&jcy;, &chcy;&tcy;&ocy; &icy; Z, &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &vcy; &ncy;&iecy;&mcy;&ncy;&ocy;&gcy;&ocy; &dcy;&rcy;&ucy;&gcy;&ocy;&mcy; &pcy;&ocy;&rcy;&yacy;&dcy;&kcy;&iecy;.</span></p> <p><span data-i18n="87a25e2494f9582f124b5b4048fa2739d545a6a381d96adec3e1cd22c52fe05c/d4" data-source="So if we could just &amp;quot;replace&amp;quot; Z by Z&amp;apos; when we bisect, then we would not need to add anything to a script. It would just work for anyone in the project sharing the special branches and the replacements." onmousemove="i18n(this)">&Icy;&tcy;&acy;&kcy;, &iecy;&scy;&lcy;&icy; &bcy;&ycy; &mcy;&ycy; &mcy;&ocy;&gcy;&lcy;&icy; &pcy;&rcy;&ocy;&scy;&tcy;&ocy;  &quot;replace&quot;  Z &ncy;&acy; Z&apos; &pcy;&rcy;&icy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&icy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &ncy;&acy;&mcy; &ncy;&iecy; &ncy;&ucy;&zhcy;&ncy;&ocy; &bcy;&ycy;&lcy;&ocy; &bcy;&ycy; &ncy;&icy;&chcy;&iecy;&gcy;&ocy; &dcy;&ocy;&bcy;&acy;&vcy;&lcy;&yacy;&tcy;&softcy; &vcy; &scy;&tscy;&iecy;&ncy;&acy;&rcy;&icy;&jcy;. &Ecy;&tcy;&ocy; &pcy;&rcy;&ocy;&scy;&tcy;&ocy; &scy;&rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy; &dcy;&lcy;&yacy; &vcy;&scy;&iecy;&khcy; &ucy;&chcy;&acy;&scy;&tcy;&ncy;&icy;&kcy;&ocy;&vcy; &pcy;&rcy;&ocy;&iecy;&kcy;&tcy;&acy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yucy;&shchcy;&icy;&khcy; &scy;&pcy;&iecy;&tscy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&iecy; &vcy;&iecy;&tcy;&kcy;&icy; &icy; &zcy;&acy;&mcy;&iecy;&ncy;&ycy;.</span></p> <p><span data-i18n="d2c3e4e052dcdf00c978bf9b613e5737515747606bfb0d09c295102430c49ae0/4d" data-source="With the example above that would give:" onmousemove="i18n(this)">&Vcy; &pcy;&rcy;&icy;&vcy;&iecy;&dcy;&iecy;&ncy;&ncy;&ocy;&mcy; &vcy;&ycy;&shcy;&iecy; &pcy;&rcy;&icy;&mcy;&iecy;&rcy;&iecy; &ecy;&tcy;&ocy; &dcy;&acy;&scy;&tcy;:</span></p> <div> <div> <pre class="hljs language-bash">      (BBC+BFC)-X1<span class="hljs-string">&apos;-X2&apos;</span>-X3<span class="hljs-string">&apos;-X4&apos;</span>-X5<span class="hljs-string">&apos;-X6&apos;</span>-Z<span class="hljs-string">&apos;-...
     /
...-Y-BBC-X1-X2-X3-X4-X5-X6-BFC-Z</span></pre> </div> </div> <p><span data-i18n="110b929a856db2b7eb5ce2a1aa6edc4ac8ff9bcf2e8f8bf43b4094bcd4d8b9df/4f" data-source="That&amp;rsquo;s why the &amp;quot;git replace&amp;quot; command was created. Technically it stores replacements &amp;quot;refs&amp;quot; in the &amp;quot;refs/replace/&amp;quot; hierarchy. These &amp;quot;refs&amp;quot; are like branches (that are stored in &amp;quot;refs/heads/&amp;quot;) or tags (that are stored in &amp;quot;refs/tags&amp;quot;), and that means that they can automatically be shared like branches or tags among developers." onmousemove="i18n(this)">&Vcy;&ocy;&tcy; &pcy;&ocy;&chcy;&iecy;&mcy;&ucy; &bcy;&ycy;&lcy;&acy; &scy;&ocy;&zcy;&dcy;&acy;&ncy;&acy; &kcy;&ocy;&mcy;&acy;&ncy;&dcy;&acy;  &quot;git replace&quot; . &Tcy;&iecy;&khcy;&ncy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &ocy;&ncy; &khcy;&rcy;&acy;&ncy;&icy;&tcy; &zcy;&acy;&mcy;&iecy;&ncy;&ycy;  &quot;refs&quot;  &vcy; &icy;&iecy;&rcy;&acy;&rcy;&khcy;&icy;&icy;  &quot;refs/replace/&quot; . &Ecy;&tcy;&icy;  &quot;refs&quot;  &pcy;&ocy;&khcy;&ocy;&zhcy;&icy; &ncy;&acy; &vcy;&iecy;&tcy;&kcy;&icy; (&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &khcy;&rcy;&acy;&ncy;&yacy;&tcy;&scy;&yacy; &vcy;  &quot;refs/heads/&quot; ) &icy;&lcy;&icy; &tcy;&iecy;&gcy;&icy; (&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &khcy;&rcy;&acy;&ncy;&yacy;&tcy;&scy;&yacy; &vcy;  &quot;refs/tags&quot; ), &acy; &ecy;&tcy;&ocy; &ocy;&zcy;&ncy;&acy;&chcy;&acy;&iecy;&tcy;, &chcy;&tcy;&ocy; &ocy;&ncy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy;&scy;&yacy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&acy;&mcy;&icy; &kcy;&acy;&kcy; &vcy;&iecy;&tcy;&kcy;&icy; &icy;&lcy;&icy; &tcy;&iecy;&gcy;&icy;.</span></p> <p><span data-i18n="9ad2263542983e1e6703043ec1706a7b69d4b213b2c8d808f28d02cbfe7eca8a/34" data-source="&amp;quot;git replace&amp;quot; is a very powerful mechanism. It can be used to fix commits in already released history, for example to change the commit message or the author. And it can also be used instead of git &amp;quot;grafts&amp;quot; to link a repository with another old repository." onmousemove="i18n(this)">&quot;git replace&quot;  &ndash; &ocy;&chcy;&iecy;&ncy;&softcy; &mcy;&ocy;&shchcy;&ncy;&ycy;&jcy; &mcy;&iecy;&khcy;&acy;&ncy;&icy;&zcy;&mcy;. &IEcy;&gcy;&ocy; &mcy;&ocy;&zhcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &dcy;&lcy;&yacy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&yacy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&ocy;&vcy; &vcy; &ucy;&zhcy;&iecy; &vcy;&ycy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ncy;&ocy;&jcy; &icy;&scy;&tcy;&ocy;&rcy;&icy;&icy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;, &dcy;&lcy;&yacy; &icy;&zcy;&mcy;&iecy;&ncy;&iecy;&ncy;&icy;&yacy; &scy;&ocy;&ocy;&bcy;&shchcy;&iecy;&ncy;&icy;&yacy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy; &icy;&lcy;&icy; &acy;&vcy;&tcy;&ocy;&rcy;&acy;. &Acy; &iecy;&shchcy;&iecy; &iecy;&gcy;&ocy; &mcy;&ocy;&zhcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &vcy;&mcy;&iecy;&scy;&tcy;&ocy;  git   &quot;grafts&quot;  &dcy;&lcy;&yacy; &scy;&vcy;&yacy;&zcy;&icy; &rcy;&iecy;&pcy;&ocy;&zcy;&icy;&tcy;&ocy;&rcy;&icy;&yacy; &scy; &dcy;&rcy;&ucy;&gcy;&icy;&mcy; &scy;&tcy;&acy;&rcy;&ycy;&mcy; &rcy;&iecy;&pcy;&ocy;&zcy;&icy;&tcy;&ocy;&rcy;&icy;&iecy;&mcy;.</span></p> <p><span data-i18n="9d9951ef2838e5439d0add89b77bd3c58070d67c5defd133129e21f0f9e442af/51" data-source="In fact it&amp;rsquo;s this last feature that &amp;quot;sold&amp;quot; it to the Git community, so it is now in the &amp;quot;master&amp;quot; branch of Git&amp;rsquo;s Git repository and it should be released in Git 1.6.5 in October or November 2009." onmousemove="i18n(this)">&Fcy;&acy;&kcy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;, &icy;&mcy;&iecy;&ncy;&ncy;&ocy; &ecy;&tcy;&ucy; &pcy;&ocy;&scy;&lcy;&iecy;&dcy;&ncy;&yucy;&yucy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&yucy;  &quot;sold&quot;  &pcy;&rcy;&iecy;&dcy;&ocy;&scy;&tcy;&acy;&vcy;&icy;&lcy; &scy;&ocy;&ocy;&bcy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;  Git , &pcy;&ocy;&ecy;&tcy;&ocy;&mcy;&ucy; &tcy;&iecy;&pcy;&iecy;&rcy;&softcy; &ocy;&ncy;&acy; &ncy;&acy;&khcy;&ocy;&dcy;&icy;&tcy;&scy;&yacy; &vcy; &vcy;&iecy;&tcy;&kcy;&iecy;  &quot;master&quot;  &rcy;&iecy;&pcy;&ocy;&zcy;&icy;&tcy;&ocy;&rcy;&icy;&yacy;  Git   Git  &icy; &dcy;&ocy;&lcy;&zhcy;&ncy;&acy; &bcy;&ycy;&tcy;&softcy; &vcy;&ycy;&pcy;&ucy;&shchcy;&iecy;&ncy;&acy; &vcy;  Git  1.6.5 &vcy; &ocy;&kcy;&tcy;&yacy;&bcy;&rcy;&iecy; &icy;&lcy;&icy; &ncy;&ocy;&yacy;&bcy;&rcy;&iecy; 2009 &gcy;&ocy;&dcy;&acy;.</span></p> <p><span data-i18n="68a815c5c7f9a4a2405b45d08249104633b1b463a75fd81e16373776ae882232/43" data-source="One problem with &amp;quot;git replace&amp;quot; is that currently it stores all the replacements refs in &amp;quot;refs/replace/&amp;quot;, but it would be perhaps better if the replacement refs that are useful only for bisecting would be in &amp;quot;refs/replace/bisect/&amp;quot;. This way the replacement refs could be used only for bisecting, while other refs directly in &amp;quot;refs/replace/&amp;quot; would be used nearly all the time." onmousemove="i18n(this)">&Ocy;&dcy;&ncy;&acy; &icy;&zcy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy; &scy;  &quot;git replace&quot;  &zcy;&acy;&kcy;&lcy;&yucy;&chcy;&acy;&iecy;&tcy;&scy;&yacy; &vcy; &tcy;&ocy;&mcy;, &chcy;&tcy;&ocy; &vcy; &ncy;&acy;&scy;&tcy;&ocy;&yacy;&shchcy;&iecy;&iecy; &vcy;&rcy;&iecy;&mcy;&yacy; &ocy;&ncy; &khcy;&rcy;&acy;&ncy;&icy;&tcy; &vcy;&scy;&iecy; &scy;&scy;&ycy;&lcy;&kcy;&icy; &ncy;&acy; &zcy;&acy;&mcy;&iecy;&ncy;&ucy; &vcy;  &quot;refs/replace/&quot; , &ncy;&ocy;, &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy;, &bcy;&ycy;&lcy;&ocy; &bcy;&ycy; &lcy;&ucy;&chcy;&shcy;&iecy;, &iecy;&scy;&lcy;&icy; &bcy;&ycy; &scy;&scy;&ycy;&lcy;&kcy;&icy; &ncy;&acy; &zcy;&acy;&mcy;&iecy;&ncy;&ucy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ycy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &dcy;&lcy;&yacy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &ncy;&acy;&khcy;&ocy;&dcy;&icy;&lcy;&icy;&scy;&softcy; &vcy;  &quot;refs/replace/bisect/&quot; . &Tcy;&acy;&kcy;&icy;&mcy; &ocy;&bcy;&rcy;&acy;&zcy;&ocy;&mcy;, &scy;&scy;&ycy;&lcy;&kcy;&icy; &ncy;&acy; &zcy;&acy;&mcy;&iecy;&ncy;&ucy; &mcy;&ocy;&zhcy;&ncy;&ocy; &bcy;&ycy;&lcy;&ocy; &bcy;&ycy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&softcy; &tcy;&ocy;&lcy;&softcy;&kcy;&ocy; &dcy;&lcy;&yacy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &vcy; &tcy;&ocy; &vcy;&rcy;&iecy;&mcy;&yacy; &kcy;&acy;&kcy; &dcy;&rcy;&ucy;&gcy;&icy;&iecy; &scy;&scy;&ycy;&lcy;&kcy;&icy; &ncy;&iecy;&pcy;&ocy;&scy;&rcy;&iecy;&dcy;&scy;&tcy;&vcy;&iecy;&ncy;&ncy;&ocy; &vcy;  &quot;refs/replace/&quot;  &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&lcy;&icy;&scy;&softcy; &bcy;&ycy; &pcy;&ocy;&chcy;&tcy;&icy; &pcy;&ocy;&scy;&tcy;&ocy;&yacy;&ncy;&ncy;&ocy;.</span></p> </div> <div> <h3 class="text-body-emphasis"  id="_bisecting_sporadic_bugs"><span data-i18n="94c16b0a37285d394c0221586020e4b26645d2d1a833bd875f698db38eb98547/f8" data-source="Bisecting sporadic bugs" onmousemove="i18n(this)">&Rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &scy;&pcy;&ocy;&rcy;&acy;&dcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;&khcy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;</span></h3> <p><span data-i18n="312784363817abb57253131725ae1491a40b952568a0f1b4b845c8bf9ca9e993/8f" data-source="Another possible improvement to &amp;quot;git bisect&amp;quot; would be to optionally add some redundancy to the tests performed so that it would be more reliable when tracking sporadic bugs." onmousemove="i18n(this)">&IEcy;&shchcy;&iecy; &ocy;&dcy;&ncy;&icy;&mcy; &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ycy;&mcy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&iecy;&mcy;  &quot;git bisect&quot;  &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &dcy;&ocy;&bcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&iecy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ocy;&jcy; &icy;&zcy;&bcy;&ycy;&tcy;&ocy;&chcy;&ncy;&ocy;&scy;&tcy;&icy; &kcy; &vcy;&ycy;&pcy;&ocy;&lcy;&ncy;&yacy;&iecy;&mcy;&ycy;&mcy; &tcy;&iecy;&scy;&tcy;&acy;&mcy;, &chcy;&tcy;&ocy;&bcy;&ycy; &scy;&dcy;&iecy;&lcy;&acy;&tcy;&softcy; &iecy;&gcy;&ocy; &bcy;&ocy;&lcy;&iecy;&iecy; &ncy;&acy;&dcy;&iecy;&zhcy;&ncy;&ycy;&mcy; &pcy;&rcy;&icy; &ocy;&tcy;&scy;&lcy;&iecy;&zhcy;&icy;&vcy;&acy;&ncy;&icy;&icy; &scy;&pcy;&ocy;&rcy;&acy;&dcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;&khcy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;.</span></p> <p><span data-i18n="3672eaa64e1025ef04ed502e7ed12509eb78f7f152e2940db80169cb46ff75e5/04" data-source="This has been requested by some kernel developers because some bugs called sporadic bugs do not appear in all the kernel builds because they are very dependent on the compiler output." onmousemove="i18n(this)">&Ecy;&tcy;&ocy; &bcy;&ycy;&lcy;&ocy; &zcy;&acy;&pcy;&rcy;&ocy;&shcy;&iecy;&ncy;&ocy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&mcy;&icy; &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&chcy;&icy;&kcy;&acy;&mcy;&icy; &yacy;&dcy;&rcy;&acy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ocy;&shcy;&icy;&bcy;&kcy;&icy;, &ncy;&acy;&zcy;&ycy;&vcy;&acy;&iecy;&mcy;&ycy;&iecy; &scy;&pcy;&ocy;&rcy;&acy;&dcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;&mcy;&icy; &ocy;&shcy;&icy;&bcy;&kcy;&acy;&mcy;&icy;, &pcy;&ocy;&yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &ncy;&iecy; &vcy;&ocy; &vcy;&scy;&iecy;&khcy; &scy;&bcy;&ocy;&rcy;&kcy;&acy;&khcy; &yacy;&dcy;&rcy;&acy;, &pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ocy;&ncy;&icy; &ocy;&chcy;&iecy;&ncy;&softcy; &zcy;&acy;&vcy;&icy;&scy;&yacy;&tcy; &ocy;&tcy; &vcy;&ycy;&khcy;&ocy;&dcy;&ncy;&ycy;&khcy; &dcy;&acy;&ncy;&ncy;&ycy;&khcy; &kcy;&ocy;&mcy;&pcy;&icy;&lcy;&yacy;&tcy;&ocy;&rcy;&acy;.</span></p> <p><span data-i18n="0926432f81221b62449605d7e78875a2fd6e80d3e6bf291c9d3b6df1954e1eba/ac" data-source="The idea is that every 3 test for example, &amp;quot;git bisect&amp;quot; could ask the user to test a commit that has already been found to be &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot; (because one of its descendants or one of its ancestors has been found to be &amp;quot;good&amp;quot; or &amp;quot;bad&amp;quot; respectively). If it happens that a commit has been previously incorrectly classified then the bisection can be aborted early, hopefully before too many mistakes have been made. Then the user will have to look at what happened and then restart the bisection using a fixed bisect log." onmousemove="i18n(this)">&Icy;&dcy;&iecy;&yacy; &scy;&ocy;&scy;&tcy;&ocy;&icy;&tcy; &vcy; &tcy;&ocy;&mcy;, &chcy;&tcy;&ocy; &kcy;&acy;&zhcy;&dcy;&ycy;&jcy; &tcy;&rcy;&iecy;&tcy;&icy;&jcy; &tcy;&iecy;&scy;&tcy;, &ncy;&acy;&pcy;&rcy;&icy;&mcy;&iecy;&rcy;,  &quot;git bisect&quot;  &mcy;&ocy;&zhcy;&iecy;&tcy; &pcy;&ocy;&pcy;&rcy;&ocy;&scy;&icy;&tcy;&softcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yacy; &pcy;&rcy;&ocy;&tcy;&iecy;&scy;&tcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &ucy;&zhcy;&iecy; &ocy;&kcy;&acy;&zcy;&acy;&lcy;&scy;&yacy;  &quot;good&quot;  &icy;&lcy;&icy;  &quot;bad&quot;  (&pcy;&ocy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ucy; &ocy;&dcy;&icy;&ncy; &icy;&zcy; &iecy;&gcy;&ocy; &pcy;&ocy;&tcy;&ocy;&mcy;&kcy;&ocy;&vcy; &icy;&lcy;&icy; &ocy;&dcy;&icy;&ncy; &icy;&zcy; &iecy;&gcy;&ocy; &pcy;&rcy;&iecy;&dcy;&kcy;&ocy;&vcy; &ocy;&kcy;&acy;&zcy;&acy;&lcy;&scy;&yacy;  &quot;good&quot;  &icy;&lcy;&icy;  &quot;bad&quot;  &scy;&ocy;&ocy;&tcy;&vcy;&iecy;&tcy;&scy;&tcy;&vcy;&iecy;&ncy;&ncy;&ocy;). . &IEcy;&scy;&lcy;&icy; &scy;&lcy;&ucy;&chcy;&icy;&tcy;&scy;&yacy; &tcy;&acy;&kcy;, &chcy;&tcy;&ocy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy; &rcy;&acy;&ncy;&iecy;&iecy; &bcy;&ycy;&lcy; &ncy;&iecy;&pcy;&rcy;&acy;&vcy;&icy;&lcy;&softcy;&ncy;&ocy; &kcy;&lcy;&acy;&scy;&scy;&icy;&fcy;&icy;&tscy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;, &tcy;&ocy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &mcy;&ocy;&zhcy;&ncy;&ocy; &pcy;&rcy;&iecy;&rcy;&vcy;&acy;&tcy;&softcy; &rcy;&acy;&ncy;&softcy;&shcy;&iecy;, &zhcy;&iecy;&lcy;&acy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy; &dcy;&ocy; &tcy;&ocy;&gcy;&ocy;, &kcy;&acy;&kcy; &bcy;&ucy;&dcy;&iecy;&tcy; &dcy;&ocy;&pcy;&ucy;&shchcy;&iecy;&ncy;&ocy; &scy;&lcy;&icy;&shcy;&kcy;&ocy;&mcy; &mcy;&ncy;&ocy;&gcy;&ocy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;. &Zcy;&acy;&tcy;&iecy;&mcy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yucy; &pcy;&rcy;&icy;&dcy;&iecy;&tcy;&scy;&yacy; &pcy;&ocy;&scy;&mcy;&ocy;&tcy;&rcy;&iecy;&tcy;&softcy;, &chcy;&tcy;&ocy; &pcy;&rcy;&ocy;&icy;&zcy;&ocy;&shcy;&lcy;&ocy;, &acy; &zcy;&acy;&tcy;&iecy;&mcy; &pcy;&iecy;&rcy;&iecy;&zcy;&acy;&pcy;&ucy;&scy;&tcy;&icy;&tcy;&softcy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;, &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yacy; &fcy;&icy;&kcy;&scy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&ncy;&ycy;&jcy; &zhcy;&ucy;&rcy;&ncy;&acy;&lcy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy;.</span></p> <p><span data-i18n="27de742cd2cf188dbce67510f3a4e218947ef965889440108811fc255c897e0c/40" data-source="There is already a project called BBChop created by Ealdwulf Wuffinga on Github that does something like that using Bayesian Search Theory &lt;a href=&quot;#9&quot;&gt;[9]&lt;/a&gt;:" onmousemove="i18n(this)">&Ucy;&zhcy;&iecy; &scy;&ucy;&shchcy;&iecy;&scy;&tcy;&vcy;&ucy;&iecy;&tcy; &pcy;&rcy;&ocy;&iecy;&kcy;&tcy; &pcy;&ocy;&dcy; &ncy;&acy;&zcy;&vcy;&acy;&ncy;&icy;&iecy;&mcy; BBChop, &scy;&ocy;&zcy;&dcy;&acy;&ncy;&ncy;&ycy;&jcy; &Ecy;&lcy;&dcy;&vcy;&ucy;&lcy;&softcy;&fcy;&ocy;&mcy; &Vcy;&ucy;&fcy;&fcy;&icy;&ncy;&gcy;&ocy;&jcy; &ncy;&acy; Github, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&jcy; &dcy;&iecy;&lcy;&acy;&iecy;&tcy; &chcy;&tcy;&ocy;-&tcy;&ocy; &pcy;&ocy;&dcy;&ocy;&bcy;&ncy;&ocy;&iecy; &scy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&ncy;&icy;&iecy;&mcy; &tcy;&iecy;&ocy;&rcy;&icy;&icy; &bcy;&acy;&jcy;&iecy;&scy;&ocy;&vcy;&scy;&kcy;&ocy;&gcy;&ocy; &pcy;&ocy;&icy;&scy;&kcy;&acy;  <a href="git-bisect-lk2009.html#9">[9]</a> :</span></p> <div> <blockquote> <p><span data-i18n="5414c2b1c3dbd131bc7215834bae656eaa790bf88a0a4bdd43f6145603b7eaff/d7" data-source="BBChop is like &lt;code&gt;git bisect&lt;/code&gt; (or equivalent), but works when your bug is intermittent. That is, it works in the presence of false negatives (when a version happens to work this time even though it contains the bug). It assumes that there are no false positives (in principle, the same approach would work, but adding it may be non-trivial)." onmousemove="i18n(this)">BBChop &pcy;&ocy;&khcy;&ocy;&zhcy; &ncy;&acy;  <code>git bisect</code>  (&icy;&lcy;&icy; &iecy;&gcy;&ocy; &acy;&ncy;&acy;&lcy;&ocy;&gcy;), &ncy;&ocy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy;, &kcy;&ocy;&gcy;&dcy;&acy; &ocy;&shcy;&icy;&bcy;&kcy;&acy; &vcy;&ocy;&zcy;&ncy;&icy;&kcy;&acy;&iecy;&tcy; &pcy;&iecy;&rcy;&icy;&ocy;&dcy;&icy;&chcy;&iecy;&scy;&kcy;&icy;. &Tcy;&ocy; &iecy;&scy;&tcy;&softcy; &ocy;&ncy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy; &pcy;&rcy;&icy; &ncy;&acy;&lcy;&icy;&chcy;&icy;&icy; &ncy;&iecy;&gcy;&acy;&tcy;&icy;&vcy;&ocy;&vcy;  false  (&kcy;&ocy;&gcy;&dcy;&acy; &vcy;&iecy;&rcy;&scy;&icy;&yacy; &ncy;&acy; &ecy;&tcy;&ocy;&tcy; &rcy;&acy;&zcy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy;, &dcy;&acy;&zhcy;&iecy; &iecy;&scy;&lcy;&icy; &ocy;&ncy;&acy; &scy;&ocy;&dcy;&iecy;&rcy;&zhcy;&icy;&tcy; &ocy;&shcy;&icy;&bcy;&kcy;&ucy;). &Pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&iecy;&tcy;&scy;&yacy;, &chcy;&tcy;&ocy; &pcy;&ocy;&zcy;&icy;&tcy;&icy;&vcy;&ocy;&vcy;  false  &ncy;&iecy;&tcy; (&vcy; &pcy;&rcy;&icy;&ncy;&tscy;&icy;&pcy;&iecy;, &tcy;&ocy;&tcy; &zhcy;&iecy; &pcy;&ocy;&dcy;&khcy;&ocy;&dcy; &bcy;&ucy;&dcy;&iecy;&tcy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&tcy;&softcy;, &ncy;&ocy; &iecy;&gcy;&ocy; &dcy;&ocy;&bcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&iecy; &mcy;&ocy;&zhcy;&iecy;&tcy; &bcy;&ycy;&tcy;&softcy; &ncy;&iecy;&tcy;&rcy;&icy;&vcy;&icy;&acy;&lcy;&softcy;&ncy;&ycy;&mcy;).</span></p> </blockquote> </div> <p><span data-i18n="4257cc1a315d1398f7718d9efe111216cae9cbd3f7ce239776ed441244ac1111/0f" data-source="But BBChop is independent of any VCS and it would be easier for Git users to have something integrated in Git." onmousemove="i18n(this)">&Ncy;&ocy; BBChop &ncy;&iecy; &zcy;&acy;&vcy;&icy;&scy;&icy;&tcy; &ocy;&tcy; &kcy;&acy;&kcy;&ocy;&jcy;-&lcy;&icy;&bcy;&ocy; &scy;&icy;&scy;&tcy;&iecy;&mcy;&ycy; &kcy;&ocy;&ncy;&tcy;&rcy;&ocy;&lcy;&yacy; &vcy;&iecy;&rcy;&scy;&icy;&jcy;, &icy; &pcy;&ocy;&lcy;&softcy;&zcy;&ocy;&vcy;&acy;&tcy;&iecy;&lcy;&yacy;&mcy;  Git  &bcy;&ycy;&lcy;&ocy; &bcy;&ycy; &pcy;&rcy;&ocy;&shchcy;&iecy; &icy;&ncy;&tcy;&iecy;&gcy;&rcy;&icy;&rcy;&ocy;&vcy;&acy;&tcy;&softcy; &chcy;&tcy;&ocy;-&tcy;&ocy; &vcy;  Git .</span></p> </div> </div> <h2 class="text-body-emphasis"  id="_conclusion"><span data-i18n="89db2ad881f29c18b305a20c8ed7bdffdfde49d633c27a83bd204bf9cfedaba3/bf" data-source="Conclusion" onmousemove="i18n(this)">Conclusion</span></h2> <div> <p><span data-i18n="c8f1f2b2f90b1d9706b2ec14e7f1298519300a0c48e62fa9d42f419e0073b052/ed" data-source="We have seen that regressions are an important problem, and that &amp;quot;git bisect&amp;quot; has nice features that complement very well practices and other tools, especially test suites, that are generally used to fight regressions. But it might be needed to change some work-flows and (bad) habits to get the most out of it." onmousemove="i18n(this)">&Mcy;&ycy; &ucy;&vcy;&icy;&dcy;&iecy;&lcy;&icy;, &chcy;&tcy;&ocy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&icy; &yacy;&vcy;&lcy;&yacy;&yucy;&tcy;&scy;&yacy; &vcy;&acy;&zhcy;&ncy;&ocy;&jcy; &pcy;&rcy;&ocy;&bcy;&lcy;&iecy;&mcy;&ocy;&jcy; &icy; &chcy;&tcy;&ocy;  &quot;git bisect&quot;  &icy;&mcy;&iecy;&iecy;&tcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&iecy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&icy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &dcy;&ocy;&pcy;&ocy;&lcy;&ncy;&yacy;&yucy;&tcy; &ocy;&chcy;&iecy;&ncy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&icy;&iecy; &pcy;&rcy;&acy;&kcy;&tcy;&icy;&kcy;&icy; &icy; &dcy;&rcy;&ucy;&gcy;&icy;&iecy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy;&ycy;, &ocy;&scy;&ocy;&bcy;&iecy;&ncy;&ncy;&ocy; &ncy;&acy;&bcy;&ocy;&rcy;&ycy; &tcy;&iecy;&scy;&tcy;&ocy;&vcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ocy;&bcy;&ycy;&chcy;&ncy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&yucy;&tcy;&scy;&yacy; &dcy;&lcy;&yacy; &bcy;&ocy;&rcy;&softcy;&bcy;&ycy; &scy; &rcy;&iecy;&gcy;&rcy;&iecy;&scy;&scy;&icy;&yacy;&mcy;&icy;. &Ncy;&ocy;, &vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ocy;, &pcy;&ocy;&tcy;&rcy;&iecy;&bcy;&ucy;&iecy;&tcy;&scy;&yacy; &icy;&zcy;&mcy;&iecy;&ncy;&icy;&tcy;&softcy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &rcy;&acy;&bcy;&ocy;&chcy;&icy;&iecy; &pcy;&rcy;&ocy;&tscy;&iecy;&scy;&scy;&ycy; &icy; (&pcy;&lcy;&ocy;&khcy;&icy;&iecy;) &pcy;&rcy;&icy;&vcy;&ycy;&chcy;&kcy;&icy;, &chcy;&tcy;&ocy;&bcy;&ycy; &pcy;&ocy;&lcy;&ucy;&chcy;&icy;&tcy;&softcy; &ocy;&tcy; &ecy;&tcy;&ocy;&gcy;&ocy; &mcy;&acy;&kcy;&scy;&icy;&mcy;&acy;&lcy;&softcy;&ncy;&ucy;&yucy; &pcy;&ocy;&lcy;&softcy;&zcy;&ucy;.</span></p> <p><span data-i18n="16749e472d940bde531ada43956bf717c4428f478e2a0bc990e7f31b19bd1b8a/74" data-source="Some improvements to the algorithms inside &amp;quot;git bisect&amp;quot; are possible and some new features could help in some cases, but overall &amp;quot;git bisect&amp;quot; works already very well, is used a lot, and is already very useful. To back up that last claim, let&amp;rsquo;s give the final word to Ingo Molnar when he was asked by the author how much time does he think &amp;quot;git bisect&amp;quot; saves him when he uses it:" onmousemove="i18n(this)">&Vcy;&ocy;&zcy;&mcy;&ocy;&zhcy;&ncy;&ycy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&yacy; &acy;&lcy;&gcy;&ocy;&rcy;&icy;&tcy;&mcy;&ocy;&vcy; &vcy;&ncy;&ucy;&tcy;&rcy;&icy;  &quot;git bisect&quot; , &icy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &ncy;&ocy;&vcy;&ycy;&iecy; &fcy;&ucy;&ncy;&kcy;&tscy;&icy;&icy; &mcy;&ocy;&gcy;&ucy;&tcy; &pcy;&ocy;&mcy;&ocy;&chcy;&softcy; &vcy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy; &scy;&lcy;&ucy;&chcy;&acy;&yacy;&khcy;, &ncy;&ocy; &vcy; &tscy;&iecy;&lcy;&ocy;&mcy;  &quot;git bisect&quot;  &ucy;&zhcy;&iecy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&iecy;&tcy; &ocy;&chcy;&iecy;&ncy;&softcy; &khcy;&ocy;&rcy;&ocy;&shcy;&ocy;, &chcy;&acy;&scy;&tcy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy;&scy;&yacy; &icy; &ucy;&zhcy;&iecy; &ocy;&chcy;&iecy;&ncy;&softcy; &pcy;&ocy;&lcy;&iecy;&zcy;&iecy;&ncy;. &Vcy; &pcy;&ocy;&dcy;&tcy;&vcy;&iecy;&rcy;&zhcy;&dcy;&iecy;&ncy;&icy;&iecy; &ecy;&tcy;&ocy;&gcy;&ocy; &pcy;&ocy;&scy;&lcy;&iecy;&dcy;&ncy;&iecy;&gcy;&ocy; &ucy;&tcy;&vcy;&iecy;&rcy;&zhcy;&dcy;&iecy;&ncy;&icy;&yacy; &dcy;&acy;&vcy;&acy;&jcy;&tcy;&iecy; &dcy;&acy;&dcy;&icy;&mcy; &pcy;&ocy;&scy;&lcy;&iecy;&dcy;&ncy;&iecy;&iecy; &scy;&lcy;&ocy;&vcy;&ocy; &Icy;&ncy;&gcy;&ocy; &Mcy;&ocy;&lcy;&ncy;&acy;&rcy;&ucy;, &kcy;&ocy;&gcy;&dcy;&acy; &acy;&vcy;&tcy;&ocy;&rcy; &scy;&pcy;&rcy;&ocy;&scy;&icy;&lcy; &iecy;&gcy;&ocy;, &scy;&kcy;&ocy;&lcy;&softcy;&kcy;&ocy; &vcy;&rcy;&iecy;&mcy;&iecy;&ncy;&icy;, &pcy;&ocy; &iecy;&gcy;&ocy; &mcy;&ncy;&iecy;&ncy;&icy;&yucy;, &ecy;&kcy;&ocy;&ncy;&ocy;&mcy;&icy;&tcy; &iecy;&mcy;&ucy;  &quot;git bisect&quot; , &kcy;&ocy;&gcy;&dcy;&acy; &ocy;&ncy; &iecy;&gcy;&ocy; &icy;&scy;&pcy;&ocy;&lcy;&softcy;&zcy;&ucy;&iecy;&tcy;:</span></p> <div> <blockquote> <p><span data-i18n="20e11619add2f34cf78f78c6a359fecc0ccf50dda5ec7bc2651680d68e9790bb/02" data-source="a &lt;code&gt;lot&lt;/code&gt;." onmousemove="i18n(this)">a <code>lot</code>.</span></p> <p><span data-i18n="9285079e28567ccf0d75ee11df497145929bb5321c5edf507ac3981772a48325/0c" data-source="About ten years ago did i do my first &lt;code&gt;bisection&lt;/code&gt; of a Linux patch queue. That was prior the Git (and even prior the BitKeeper) days. I literally days spent sorting out patches, creating what in essence were standalone commits that i guessed to be related to that bug." onmousemove="i18n(this)">&Ocy;&kcy;&ocy;&lcy;&ocy; &dcy;&iecy;&scy;&yacy;&tcy;&icy; &lcy;&iecy;&tcy; &ncy;&acy;&zcy;&acy;&dcy; &yacy; &scy;&dcy;&iecy;&lcy;&acy;&lcy; &scy;&vcy;&ocy;&jcy; &pcy;&iecy;&rcy;&vcy;&ycy;&jcy;  <code>bisection</code>  &icy;&zcy; &ocy;&chcy;&iecy;&rcy;&iecy;&dcy;&icy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&jcy; Linux. &Ecy;&tcy;&ocy; &bcy;&ycy;&lcy;&ocy; &dcy;&ocy;  Git  (&icy; &dcy;&acy;&zhcy;&iecy; &dcy;&ocy; BitKeeper). &YAcy; &bcy;&ucy;&kcy;&vcy;&acy;&lcy;&softcy;&ncy;&ocy; &dcy;&ncy;&icy; &pcy;&ocy;&tcy;&rcy;&acy;&tcy;&icy;&lcy; &ncy;&acy; &scy;&ocy;&rcy;&tcy;&icy;&rcy;&ocy;&vcy;&kcy;&ucy; &pcy;&acy;&tcy;&chcy;&iecy;&jcy;, &scy;&ocy;&zcy;&dcy;&acy;&ncy;&icy;&iecy; &tcy;&ocy;&gcy;&ocy;, &chcy;&tcy;&ocy; &pcy;&ocy; &scy;&ucy;&tcy;&icy; &bcy;&ycy;&lcy;&ocy; &acy;&vcy;&tcy;&ocy;&ncy;&ocy;&mcy;&ncy;&ycy;&mcy;&icy; &kcy;&ocy;&mcy;&mcy;&icy;&tcy;&acy;&mcy;&icy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy;, &kcy;&acy;&kcy; &yacy; &pcy;&rcy;&iecy;&dcy;&pcy;&ocy;&lcy;&acy;&gcy;&acy;&lcy;, &bcy;&ycy;&lcy;&icy; &scy;&vcy;&yacy;&zcy;&acy;&ncy;&ycy; &scy; &ecy;&tcy;&ocy;&jcy; &ocy;&shcy;&icy;&bcy;&kcy;&ocy;&jcy;.</span></p> <p><span data-i18n="51c8205392615d4c14f18d45188bd36becf70924558c5e85c4faca2ab8955850/bb" data-source="It was a tool of absolute last resort. I&amp;rsquo;d rather spend days looking at printk output than do a manual &lt;code&gt;patch bisection&lt;/code&gt;." onmousemove="i18n(this)">&Ecy;&tcy;&ocy; &bcy;&ycy;&lcy; &icy;&ncy;&scy;&tcy;&rcy;&ucy;&mcy;&iecy;&ncy;&tcy; &acy;&bcy;&scy;&ocy;&lcy;&yucy;&tcy;&ncy;&ocy;&gcy;&ocy; &pcy;&ocy;&scy;&lcy;&iecy;&dcy;&ncy;&iecy;&gcy;&ocy; &scy;&rcy;&iecy;&dcy;&scy;&tcy;&vcy;&acy;. &YAcy; &lcy;&ucy;&chcy;&shcy;&iecy; &pcy;&ocy;&tcy;&rcy;&acy;&chcy;&ucy; &dcy;&ncy;&icy; &ncy;&acy; &pcy;&rcy;&ocy;&scy;&mcy;&ocy;&tcy;&rcy; &vcy;&ycy;&vcy;&ocy;&dcy;&acy; printk, &chcy;&iecy;&mcy; &ncy;&acy; &rcy;&ucy;&chcy;&ncy;&ocy;&jcy;  <code>patch bisection</code> .</span></p> <p><span data-i18n="ac1069584f21c88cd315747b5a5ce61ed4596e982180a7bfb6985cdb5fc5f866/3d" data-source="With Git bisect it&amp;rsquo;s a breeze: in the best case i can get a ~15 step kernel bisection done in 20-30 minutes, in an automated way. Even with manual help or when bisecting multiple, overlapping bugs, it&amp;rsquo;s rarely more than an hour." onmousemove="i18n(this)">&Scy;  Git  bisect &ecy;&tcy;&ocy; &pcy;&rcy;&ocy;&shchcy;&iecy; &pcy;&rcy;&ocy;&scy;&tcy;&ocy;&gcy;&ocy;: &vcy; &lcy;&ucy;&chcy;&shcy;&iecy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy; &yacy; &mcy;&ocy;&gcy;&ucy; &acy;&vcy;&tcy;&ocy;&mcy;&acy;&tcy;&icy;&chcy;&iecy;&scy;&kcy;&icy; &vcy;&ycy;&pcy;&ocy;&lcy;&ncy;&icy;&tcy;&softcy; 15-&shcy;&acy;&gcy;&ocy;&vcy;&ocy;&iecy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &yacy;&dcy;&rcy;&acy; &zcy;&acy; 20-30 &mcy;&icy;&ncy;&ucy;&tcy;. &Dcy;&acy;&zhcy;&iecy; &pcy;&rcy;&icy; &rcy;&ucy;&chcy;&ncy;&ocy;&jcy; &pcy;&ocy;&mcy;&ocy;&shchcy;&icy; &icy;&lcy;&icy; &pcy;&rcy;&icy; &rcy;&acy;&zcy;&dcy;&iecy;&lcy;&iecy;&ncy;&icy;&icy; &ncy;&iecy;&scy;&kcy;&ocy;&lcy;&softcy;&kcy;&icy;&khcy; &pcy;&iecy;&rcy;&iecy;&kcy;&rcy;&ycy;&vcy;&acy;&yucy;&shchcy;&icy;&khcy;&scy;&yacy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy; &ecy;&tcy;&ocy; &rcy;&iecy;&dcy;&kcy;&ocy; &zcy;&acy;&ncy;&icy;&mcy;&acy;&iecy;&tcy; &bcy;&ocy;&lcy;&softcy;&shcy;&iecy; &chcy;&acy;&scy;&acy;.</span></p> <p><span data-i18n="b5239ea572a8afd9c5c765aebb8c2e3e740cf93c4a651b461a748f2a588ad518/1f" data-source="In fact it&amp;rsquo;s invaluable because there are bugs i would never even &lt;code&gt;try&lt;/code&gt; to debug if it wasn&amp;rsquo;t for git bisect. In the past there were bug patterns that were immediately hopeless for me to debug - at best i could send the crash/bug signature to lkml and hope that someone else can think of something." onmousemove="i18n(this)">&Ncy;&acy; &scy;&acy;&mcy;&ocy;&mcy; &dcy;&iecy;&lcy;&iecy; &ecy;&tcy;&ocy; &bcy;&iecy;&scy;&tscy;&iecy;&ncy;&ncy;&ocy;, &pcy;&ocy;&tcy;&ocy;&mcy;&ucy; &chcy;&tcy;&ocy; &iecy;&scy;&tcy;&softcy; &ocy;&shcy;&icy;&bcy;&kcy;&icy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &yacy; &bcy;&ycy; &ncy;&icy;&kcy;&ocy;&gcy;&dcy;&acy; &ncy;&iecy; &ocy;&tcy;&lcy;&acy;&dcy;&icy;&lcy; &dcy;&acy;&zhcy;&iecy; &vcy;  <code>try</code> , &iecy;&scy;&lcy;&icy; &bcy;&ycy; &ncy;&iecy;  git  bisect. &Vcy; &pcy;&rcy;&ocy;&shcy;&lcy;&ocy;&mcy; &bcy;&ycy;&lcy;&icy; &shcy;&acy;&bcy;&lcy;&ocy;&ncy;&ycy; &ocy;&shcy;&icy;&bcy;&ocy;&kcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &mcy;&ncy;&iecy; &bcy;&ycy;&lcy;&ocy; &bcy;&iecy;&zcy;&ncy;&acy;&dcy;&iecy;&zhcy;&ncy;&ocy; &ocy;&tcy;&lcy;&acy;&dcy;&icy;&tcy;&softcy; - &vcy; &lcy;&ucy;&chcy;&shcy;&iecy;&mcy; &scy;&lcy;&ucy;&chcy;&acy;&iecy; &yacy; &mcy;&ocy;&gcy; &ocy;&tcy;&pcy;&rcy;&acy;&vcy;&icy;&tcy;&softcy; &scy;&icy;&gcy;&ncy;&acy;&tcy;&ucy;&rcy;&ucy; &scy;&bcy;&ocy;&yacy;/&ocy;&shcy;&icy;&bcy;&kcy;&icy; &vcy; lkml &icy; &ncy;&acy;&dcy;&iecy;&yacy;&tcy;&softcy;&scy;&yacy;, &chcy;&tcy;&ocy; &kcy;&tcy;&ocy;-&tcy;&ocy; &iecy;&shchcy;&iecy; &chcy;&tcy;&ocy;-&ncy;&icy;&bcy;&ucy;&dcy;&softcy; &pcy;&rcy;&icy;&dcy;&ucy;&mcy;&acy;&iecy;&tcy;.</span></p> <p><span data-i18n="a3ce6e9020b371c95c3098f6b82ecb42e2a510fae41c3c4802256656f8943810/94" data-source="And even if a bisection fails today it tells us something valuable about the bug: that it&amp;rsquo;s non-deterministic - timing or kernel image layout dependent." onmousemove="i18n(this)">&Icy; &dcy;&acy;&zhcy;&iecy; &iecy;&scy;&lcy;&icy; &scy;&iecy;&gcy;&ocy;&dcy;&ncy;&yacy; &dcy;&iecy;&lcy;&iecy;&ncy;&icy;&iecy; &pcy;&ocy;&pcy;&ocy;&lcy;&acy;&mcy; &ncy;&iecy; &ucy;&dcy;&acy;&scy;&tcy;&scy;&yacy;, &ecy;&tcy;&ocy; &rcy;&acy;&scy;&scy;&kcy;&acy;&zhcy;&iecy;&tcy; &ncy;&acy;&mcy; &kcy;&ocy;&iecy;-&chcy;&tcy;&ocy; &tscy;&iecy;&ncy;&ncy;&ocy;&iecy; &ocy;&bcy; &ocy;&shcy;&icy;&bcy;&kcy;&iecy;: &ocy;&ncy;&acy; &ncy;&iecy;&dcy;&iecy;&tcy;&iecy;&rcy;&mcy;&icy;&ncy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&acy; - &zcy;&acy;&vcy;&icy;&scy;&icy;&tcy; &ocy;&tcy; &vcy;&rcy;&iecy;&mcy;&iecy;&ncy;&icy; &icy;&lcy;&icy; &mcy;&acy;&kcy;&iecy;&tcy;&acy; &ocy;&bcy;&rcy;&acy;&zcy;&acy; &yacy;&dcy;&rcy;&acy;.</span></p> <p><span data-i18n="9ed64fab8d480dca923bd0ed76a0e89c5eb4856d638ee30c4b83d7c677480646/e4" data-source="So git bisect is unconditional goodness - and feel free to quote that ;-)" onmousemove="i18n(this)">&Tcy;&acy;&kcy; &chcy;&tcy;&ocy;  git  bisect &mdash; &ecy;&tcy;&ocy; &bcy;&iecy;&zcy;&ocy;&gcy;&ocy;&vcy;&ocy;&rcy;&ocy;&chcy;&ncy;&ocy;&iecy; &dcy;&ocy;&bcy;&rcy;&ocy; &mdash; &icy; &scy;&mcy;&iecy;&lcy;&ocy; &tscy;&icy;&tcy;&icy;&rcy;&ucy;&jcy;&tcy;&iecy; &ecy;&tcy;&ocy; ;-)</span></p> </blockquote> </div> </div> <h2 class="text-body-emphasis"  id="_acknowledgments"><span data-i18n="4be0f860ee3560910d50596233fe802eeecf0972c7a9de427a76ae9a622e2ea1/47" data-source="Acknowledgments" onmousemove="i18n(this)">Acknowledgments</span></h2> <div> <p><span data-i18n="01817fb98e874c5a222f484313384d24582a151529e16d4a5f45f02293e738ae/c1" data-source="Many thanks to Junio Hamano for his help in reviewing this paper, for reviewing the patches I sent to the Git mailing list, for discussing some ideas and helping me improve them, for improving &amp;quot;git bisect&amp;quot; a lot and for his awesome work in maintaining and developing Git." onmousemove="i18n(this)">&Bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&iecy; &scy;&pcy;&acy;&scy;&icy;&bcy;&ocy; &YUcy;&ncy;&icy;&ocy; &KHcy;&acy;&mcy;&acy;&ncy;&ocy; &zcy;&acy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy; &vcy; &rcy;&iecy;&tscy;&iecy;&ncy;&zcy;&icy;&rcy;&ocy;&vcy;&acy;&ncy;&icy;&icy; &ecy;&tcy;&ocy;&jcy; &scy;&tcy;&acy;&tcy;&softcy;&icy;, &zcy;&acy; &ocy;&bcy;&zcy;&ocy;&rcy; &icy;&scy;&pcy;&rcy;&acy;&vcy;&lcy;&iecy;&ncy;&icy;&jcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &yacy; &ocy;&tcy;&pcy;&rcy;&acy;&vcy;&icy;&lcy; &vcy; &scy;&pcy;&icy;&scy;&ocy;&kcy; &rcy;&acy;&scy;&scy;&ycy;&lcy;&kcy;&icy;  Git , &zcy;&acy; &ocy;&bcy;&scy;&ucy;&zhcy;&dcy;&iecy;&ncy;&icy;&iecy; &ncy;&iecy;&kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&khcy; &icy;&dcy;&iecy;&jcy; &icy; &pcy;&ocy;&mcy;&ocy;&shchcy;&softcy; &vcy; &icy;&khcy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&icy;, &zcy;&acy; &zcy;&ncy;&acy;&chcy;&icy;&tcy;&iecy;&lcy;&softcy;&ncy;&ocy;&iecy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&iecy;  &quot;git bisect&quot;  &icy; &zcy;&acy; &iecy;&gcy;&ocy; &pcy;&ocy;&tcy;&rcy;&yacy;&scy;&acy;&yucy;&shchcy;&ucy;&yucy; &rcy;&acy;&bcy;&ocy;&tcy;&ucy; &pcy;&ocy; &pcy;&ocy;&dcy;&dcy;&iecy;&rcy;&zhcy;&kcy;&iecy; &icy; &rcy;&acy;&zcy;&vcy;&icy;&tcy;&icy;&yucy;  Git . .</span></p> <p><span data-i18n="eea09fe15f9576a6ed3ab393fbac83229f847b1cd72ab10d251732b61be20c17/96" data-source="Many thanks to Ingo Molnar for giving me very useful information that appears in this paper, for commenting on this paper, for his suggestions to improve &amp;quot;git bisect&amp;quot; and for evangelizing &amp;quot;git bisect&amp;quot; on the linux kernel mailing lists." onmousemove="i18n(this)">&Bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&iecy; &scy;&pcy;&acy;&scy;&icy;&bcy;&ocy; &Icy;&ncy;&gcy;&ocy; &Mcy;&ocy;&lcy;&ncy;&acy;&rcy;&ucy; &zcy;&acy; &pcy;&rcy;&iecy;&dcy;&ocy;&scy;&tcy;&acy;&vcy;&lcy;&iecy;&ncy;&ncy;&ucy;&yucy; &mcy;&ncy;&iecy; &ocy;&chcy;&iecy;&ncy;&softcy; &pcy;&ocy;&lcy;&iecy;&zcy;&ncy;&ucy;&yucy; &icy;&ncy;&fcy;&ocy;&rcy;&mcy;&acy;&tscy;&icy;&yucy;, &kcy;&ocy;&tcy;&ocy;&rcy;&acy;&yacy; &pcy;&ocy;&yacy;&vcy;&lcy;&yacy;&iecy;&tcy;&scy;&yacy; &vcy; &ecy;&tcy;&ocy;&jcy; &scy;&tcy;&acy;&tcy;&softcy;&iecy;, &zcy;&acy; &kcy;&ocy;&mcy;&mcy;&iecy;&ncy;&tcy;&acy;&rcy;&icy;&icy; &kcy; &ecy;&tcy;&ocy;&jcy; &scy;&tcy;&acy;&tcy;&softcy;&iecy;, &zcy;&acy; &iecy;&gcy;&ocy; &pcy;&rcy;&iecy;&dcy;&lcy;&ocy;&zhcy;&iecy;&ncy;&icy;&yacy; &pcy;&ocy; &ucy;&lcy;&ucy;&chcy;&shcy;&iecy;&ncy;&icy;&yucy;  &quot;git bisect&quot;  &icy; &zcy;&acy; &pcy;&rcy;&ocy;&pcy;&acy;&gcy;&acy;&ncy;&dcy;&ucy;  &quot;git bisect&quot;  &vcy; &scy;&pcy;&icy;&scy;&kcy;&acy;&khcy; &rcy;&acy;&scy;&scy;&ycy;&lcy;&kcy;&icy; &yacy;&dcy;&rcy;&acy; Linux.</span></p> <p><span data-i18n="baa064b2e5307f242bb9be5c7990047fb3b7ac0383dd60e949b91bd1c36d6417/2b" data-source="Many thanks to Linus Torvalds for inventing, developing and evangelizing &amp;quot;git bisect&amp;quot;, Git and Linux." onmousemove="i18n(this)">&Bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&iecy; &scy;&pcy;&acy;&scy;&icy;&bcy;&ocy; &Lcy;&icy;&ncy;&ucy;&scy;&ucy; &Tcy;&ocy;&rcy;&vcy;&acy;&lcy;&softcy;&dcy;&scy;&ucy; &zcy;&acy; &icy;&zcy;&ocy;&bcy;&rcy;&iecy;&tcy;&iecy;&ncy;&icy;&iecy;, &rcy;&acy;&zcy;&rcy;&acy;&bcy;&ocy;&tcy;&kcy;&ucy; &icy; &pcy;&ocy;&pcy;&ucy;&lcy;&yacy;&rcy;&icy;&zcy;&acy;&tscy;&icy;&yucy;  &quot;git bisect&quot; ,  Git  &icy; Linux.</span></p> <p><span data-i18n="f4f914d38ce1391be8a5e4b3b062cc91641ca849dd0abe4cd107ed4da47f65a8/a8" data-source="Many thanks to the many other great people who helped one way or another when I worked on Git, especially to Andreas Ericsson, Johannes Schindelin, H. Peter Anvin, Daniel Barkalow, Bill Lear, John Hawley, Shawn O. Pierce, Jeff King, Sam Vilain, Jon Seymour." onmousemove="i18n(this)">&Bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&iecy; &scy;&pcy;&acy;&scy;&icy;&bcy;&ocy; &mcy;&ncy;&ocy;&gcy;&icy;&mcy; &dcy;&rcy;&ucy;&gcy;&icy;&mcy; &zcy;&acy;&mcy;&iecy;&chcy;&acy;&tcy;&iecy;&lcy;&softcy;&ncy;&ycy;&mcy; &lcy;&yucy;&dcy;&yacy;&mcy;, &kcy;&ocy;&tcy;&ocy;&rcy;&ycy;&iecy; &tcy;&acy;&kcy; &icy;&lcy;&icy; &icy;&ncy;&acy;&chcy;&iecy; &pcy;&ocy;&mcy;&ocy;&gcy;&acy;&lcy;&icy; &mcy;&ncy;&iecy;, &kcy;&ocy;&gcy;&dcy;&acy; &yacy; &rcy;&acy;&bcy;&ocy;&tcy;&acy;&lcy; &ncy;&acy;&dcy; Git, &ocy;&scy;&ocy;&bcy;&iecy;&ncy;&ncy;&ocy; &Acy;&ncy;&dcy;&rcy;&iecy;&acy;&scy;&ucy; &Ecy;&rcy;&icy;&kcy;&scy;&scy;&ocy;&ncy;&ucy;, &Jcy;&ocy;&khcy;&acy;&ncy;&ncy;&iecy;&scy;&ucy; &SHcy;&icy;&ncy;&dcy;&iecy;&lcy;&icy;&ncy;&ucy;, &KHcy;. &Pcy;&icy;&tcy;&iecy;&rcy;&ucy; &Acy;&ncy;&vcy;&icy;&ncy;&ucy;, &Dcy;&ecy;&ncy;&icy;&iecy;&lcy;&ucy; &Bcy;&acy;&rcy;&kcy;&acy;&lcy;&ocy;&ucy;, &Bcy;&icy;&lcy;&lcy;&ucy; &Lcy;&icy;&rcy;&ucy;, &Dcy;&zhcy;&ocy;&ncy;&ucy; &KHcy;&ocy;&ucy;&lcy;&icy;, &SHcy;&ocy;&ncy;&ucy; &Ocy;. &Pcy;&icy;&rcy;&scy;&ucy;, &Dcy;&zhcy;&iecy;&fcy;&fcy;&ucy; &Kcy;&icy;&ncy;&gcy;&ucy;, &Scy;&ecy;&mcy; &Vcy;&icy;&lcy;&iecy;&ncy;, &Dcy;&zhcy;&ocy;&ncy; &Scy;&iecy;&jcy;&mcy;&ucy;&rcy;.</span></p> <p><span data-i18n="bb878aef7454b6d9b9a3d9f8c9a30b62cbbb05242afd745635a08aad526134d3/7a" data-source="Many thanks to the Linux-Kongress program committee for choosing the author to given a talk and for publishing this paper." onmousemove="i18n(this)">&Bcy;&ocy;&lcy;&softcy;&shcy;&ocy;&iecy; &scy;&pcy;&acy;&scy;&icy;&bcy;&ocy; &pcy;&rcy;&ocy;&gcy;&rcy;&acy;&mcy;&mcy;&ncy;&ocy;&mcy;&ucy; &kcy;&ocy;&mcy;&icy;&tcy;&iecy;&tcy;&ucy; Linux-Kongress &zcy;&acy; &vcy;&ycy;&bcy;&ocy;&rcy; &acy;&vcy;&tcy;&ocy;&rcy;&acy; &dcy;&ocy;&kcy;&lcy;&acy;&dcy;&acy; &icy; &pcy;&ucy;&bcy;&lcy;&icy;&kcy;&acy;&tscy;&icy;&yucy; &dcy;&acy;&ncy;&ncy;&ocy;&jcy; &scy;&tcy;&acy;&tcy;&softcy;&icy;.</span></p> </div> <h2 class="text-body-emphasis"  id="_references"><span data-i18n="69824d3b0e70ca6aaa0da1613b65fd914c442bf1f7ad1bb22bcdfbdfe1a05e39/99" data-source="References" onmousemove="i18n(this)">References</span></h2> <div> <div> <ul> <li> <p><span data-i18n="91f4f7364ea36cf25b5337d93bd57a6112c3a9244dcfe426e7d76f3e5d774abc/11" data-source="[[[1]]] &lt;a href=&quot;https://web.archive.org/web/20091206032101/http://www.nist.gov/public_affairs/releases/n02-10.htm&quot;&gt;&lt;em&gt;Software Errors Cost U.S. Economy $59.5 Billion Annually&lt;/em&gt;. Nist News Release.&lt;/a&gt; See also &lt;a href=&quot;https://www.nist.gov/system/files/documents/director/planning/report02-3.pdf&quot;&gt;&lt;em&gt;The Economic Impacts of Inadequate Infratructure for Software Testing&lt;/em&gt;. Nist Planning Report 02-3&lt;/a&gt;, Executive Summary and Chapter 8." onmousemove="i18n(this)">[[[1]]]  <a href="https://web.archive.org/web/20091206032101/http://www.nist.gov/public_affairs/releases/n02-10.htm">Software Errors Cost U.S. Economy $59.5 Billion Annually. Nist News Release.</a>  &Scy;&mcy;. &tcy;&acy;&kcy;&zhcy;&iecy;  <a href="https://www.nist.gov/system/files/documents/director/planning/report02-3.pdf">The Economic Impacts of Inadequate Infratructure for Software Testing. Nist Planning Report 02-3</a> , &Kcy;&rcy;&acy;&tcy;&kcy;&ocy;&iecy; &ocy;&pcy;&icy;&scy;&acy;&ncy;&icy;&iecy; &icy; &gcy;&lcy;&acy;&vcy;&ucy; 8.</span></p> </li> <li> <p><span data-i18n="84cafa9a7aa42cdc469cdfdc25435abcaf7ed0350400d2bea09e0af2db11773a/b1" data-source="[[[2]]] &lt;a href=&quot;https://www.oracle.com/java/technologies/javase/codeconventions-introduction.html&quot;&gt;&lt;em&gt;Code Conventions for the Java Programming Language: 1. Introduction&lt;/em&gt;. Sun Microsystems.&lt;/a&gt;" onmousemove="i18n(this)">[[[2]]]  <a href="https://www.oracle.com/java/technologies/javase/codeconventions-introduction.html">Code Conventions for the Java Programming Language: 1. Introduction. Sun Microsystems.</a></span></p> </li> <li> <p><span data-i18n="1f8cd56f7f754bb6c02220335f33c003c07083769a5981732ecb8dfecb077a41/19" data-source="[[[3]]] &lt;a href=&quot;https://en.wikipedia.org/wiki/Software_maintenance&quot;&gt;&lt;em&gt;Software maintenance&lt;/em&gt;. Wikipedia.&lt;/a&gt;" onmousemove="i18n(this)">[[[3]]]  <a href="https://en.wikipedia.org/wiki/Software_maintenance">Software maintenance. Wikipedia.</a></span></p> </li> <li> <p><span data-i18n="d9842181e8031d8433abf0c7bac4a8ad041e864eec8f6f228b05d55f0a75a88e/cd" data-source="[[[4]]] &lt;a href=&quot;https://lore.kernel.org/git/7vps5xsbwp.fsf_-_@assigned-by-dhcp.cox.net/&quot;&gt;Junio C Hamano. &lt;em&gt;Automated bisect success story&lt;/em&gt;.&lt;/a&gt;" onmousemove="i18n(this)">[[[4]]]  <a href="https://lore.kernel.org/git/7vps5xsbwp.fsf_-_@assigned-by-dhcp.cox.net/">Junio C Hamano. Automated bisect success story.</a></span></p> </li> <li> <p><span data-i18n="cea2ecc6bd8129d40d6e40de0465a5f28480ed99923e8a648896eb8d988b2bfe/b7" data-source="[[[5]]] &lt;a href=&quot;https://lwn.net/Articles/317154/&quot;&gt;Christian Couder. &lt;em&gt;Fully automated bisecting with &amp;quot;git bisect run&amp;quot;&lt;/em&gt;. LWN.net.&lt;/a&gt;" onmousemove="i18n(this)">[[[5]]]  <a href="https://lwn.net/Articles/317154/">Christian Couder. Fully automated bisecting with &quot;git bisect run&quot;. LWN.net.</a></span></p> </li> <li> <p><span data-i18n="9b598898b6c15c4ab76a6a494e916fb8a7bb9543e10596bf6f19289a5fb9e317/64" data-source="[[[6]]] &lt;a href=&quot;https://lwn.net/Articles/277872/&quot;&gt;Jonathan Corbet. &lt;em&gt;Bisection divides users and developers&lt;/em&gt;. LWN.net.&lt;/a&gt;" onmousemove="i18n(this)">[[[6]]]  <a href="https://lwn.net/Articles/277872/">Jonathan Corbet. Bisection divides users and developers. LWN.net.</a></span></p> </li> <li> <p><span data-i18n="29b49f1373fd7c7c3d3ac359817fbe52c01123c076eb70d1e68dceba41a63951/b1" data-source="[[[7]]] &lt;a href=&quot;https://lore.kernel.org/lkml/20071207113734.GA14598@elte.hu/&quot;&gt;Ingo Molnar. &lt;em&gt;Re: BUG 2.6.23-rc3 can&amp;rsquo;t see sd partitions on Alpha&lt;/em&gt;. Linux-kernel mailing list.&lt;/a&gt;" onmousemove="i18n(this)">[[[7]]]  <a href="https://lore.kernel.org/lkml/20071207113734.GA14598@elte.hu/">Ingo Molnar. Re: BUG 2.6.23-rc3 can&rsquo;t see sd partitions on Alpha. Linux-kernel mailing list.</a></span></p> </li> <li> <p><span data-i18n="c9274e9179c9459cb667c58ad43da5a835fcb86f09be64fc00e1eea2f846dea5/7e" data-source="[[[8]]] &lt;a href=&quot;https://www.kernel.org/pub/software/scm/git/docs/git-bisect.html&quot;&gt;Junio C Hamano and the git-list. &lt;em&gt;git-bisect(1) Manual Page&lt;/em&gt;. Linux Kernel Archives.&lt;/a&gt;" onmousemove="i18n(this)">[[[8]]]  <a href="https://www.kernel.org/pub/software/scm/git/docs/git-bisect.html">Junio C Hamano and the git-list. git-bisect(1) Manual Page. Linux Kernel Archives.</a></span></p> </li> <li> <p><span data-i18n="463262bfe12b4e5dd9b40f68d7a549f349fef2fac684f95da3b5cc3bea7f49f6/0f" data-source="[[[9]]] &lt;a href=&quot;https://github.com/Ealdwulf/bbchop&quot;&gt;Ealdwulf. &lt;em&gt;bbchop&lt;/em&gt;. GitHub.&lt;/a&gt;" onmousemove="i18n(this)">[[[9]]]  <a href="https://github.com/Ealdwulf/bbchop">Ealdwulf. bbchop. GitHub.</a></span></p> </li> </ul> </div> </div><address>
<p>
    &copy; 2012&ndash;2024 Scott Chacon and others<br/>Licensed under the MIT License.<br/>
<a href="https://git-scm.com/docs/git-bisect-lk2009">https://git-scm.com/docs/git-bisect-lk2009</a>
</p>
</address>                </article>
            </main>

            <br>
            <br>
            <hr>

                               <ins class="adsbygoogle"
        style="display:block"
        data-ad-format="autorelaxed"
        data-ad-client="ca-pub-6424571640879890"
        data-ad-slot="7867651344"></ins>
   <script data-cfasync="false" src="../../../cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script>
        (adsbygoogle = window.adsbygoogle || []).push({});
   </script>            
        </div>

        <!-- -->

        <div class="col-md-3">
            <br>
            <form action="-index-.html">
                <div class="input-group">
                    <input class="form-control" type="search" name="q" placeholder="Search for Git" required>
                    <button class="btn btn-primary" type="submit">
                        <i class="bi bi-search"></i>
                    </button>
                </div>
            </form>
            <br>

                            <div class="list-group list-group-flush">
                                            <a class="list-group-item list-group-item-action text-primary-emphasis px-2 text-truncate" href="git-blame.html">
                            git blame                        </a>
                                            <a class="list-group-item list-group-item-action text-primary-emphasis px-2 text-truncate" href="git-branch.html">
                            git branch                        </a>
                                            <a class="list-group-item list-group-item-action text-primary-emphasis px-2 text-truncate" href="git-bugreport.html">
                            git bugreport                        </a>
                                            <a class="list-group-item list-group-item-action text-primary-emphasis px-2 text-truncate" href="git-bundle.html">
                            git bundle                        </a>
                                            <a class="list-group-item list-group-item-action text-primary-emphasis px-2 text-truncate" href="git-cat-file.html">
                            git cat-file                        </a>
                                            <a class="list-group-item list-group-item-action text-primary-emphasis px-2 text-truncate" href="git-check-attr.html">
                            git check-attr                        </a>
                                            <a class="list-group-item list-group-item-action text-primary-emphasis px-2 text-truncate" href="git-check-ignore.html">
                            git check-ignore                        </a>
                                    </div>
            
            <br>
            <div class="my-3">
                <ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-6424571640879890"
     data-ad-slot="3954319254"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>            </div>
            <br>

            
            
        </div>
    </div>
</div>    <!--/sse-->

    <footer>
        <br>
        <div class="container">
            <div class="row">
                <div class="col">
                    <hr>
                    <div class="row">
                        <div class="col-md-10">
                            <ul class="nav">
                                <li class="nav-item">
                                    <a class="nav-link ps-0" href="https://runebook.dev/">Help us Improve Translation</a>
                                </li>
                                                            </ul>
                        </div>
                        <div class="col-md-2 text-end">
                            <a href="git-bisect-lk2009.html#" class="fs-5" aria-label="Top">
                                <i class="bi bi-arrow-up-square-fill"></i>
                            </a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <br>
    </footer>
    <script src="../../../runebook.js"></script>
</body>

</html>